6.3.2 内存分配
现在,一个变量可以在某个程序范围内的任何地方定义,所以在这个变量的定义之前是无法对它分配内存空间的。通常,编译器更可能像C编译器一样,在一个程序块的开头就分配所有的内存。这些对我们来说是无关紧要的,因为作为一个程序员,在变量定义之前总是无法访问这块存储空间(即该对象)[1]。即使存储空间在块的一开始就被分配,构造函数也仍然要到对象的定义时才会被调用,因为标识符只有到此时才有效。编译器甚至会检查有没有把一个对象的定义(构造函数的调用)放到一个条件块中,比如在switch块中声明,或可能被goto跳过的地方。下例中解除注释的语句会导致一个警告或一个错误。
在上面的代码中,goto和switch都可能跳过构造函数调用的序列点,甚至构造函数没有被调用时,这个对象也会在后面的程序块中起作用,所以编译器给出了一条出错信息。这就确保了对象在产生的同时被初始化。
当然,这里讨论的内存分配都是在堆栈中进行的。内存分配是通过编译器向下移动堆栈指针来实现的(这里的“向下”是相对而言的,实际指针值增加,还是减少,取决于机器)。也可以在堆栈中使用new为对象分配内存,这将在第13章中进一步介绍。
[1]当然,我们可以通过指针来访问这些存储空间,但这样做是非常有害的。