c++中,如果为一个类没有明确定义一个构造函数,那么,编译器就会自动合成一个默认的构造函数。下面,通过汇编程序,来看一下其真实情况。
c++中的源程序:
class X { int main() { |
上面的类X没有定义构造函数,仅仅有一个int i。
下面为其汇编程序:
; 7 : int main() { push ebp;ebp为一个寄存器,总是指向一个函数调用堆栈的栈底,作为基址,用偏移量来访问该调用栈上的变量,但这里没有任何变量要访问,因此不起作用 ; 8 : X x; xor eax, eax;eax也是一个寄存器,这里不起作用 |
通过汇编发现,通过push ecx,编译器将堆栈栈顶移动4byte,并将寄存器的ecx的值写入,类X只含有一个int,大小刚好为4byte,因此这一句可以看成是为对象x分配空间。而接下来并没有任何函数的调用,来对这一块区域进行适当的初始化。所以,在没有明确定义一个构造函数的时候,不会有任何的初始化操作。
这种情况下,在《深度探索c++对象模型》中,认为编译器只合成了一个无用的默认构造函数。
下面再看一段c++程序:
class X { int main() { |
与上面相比,在类X里面增加了一个成员变量int j,类的大小变为8字节。
下面为对应汇编码:
; 8 : int main() { push ebp ; 9 : X x; xor eax, eax |
从汇编码看出,通过sub esp,8指令,堆栈确实留出了8byte的空间,刚好等于类X的大小,同样没有调用任何函数,来进行初始化操作。
所以,综上所述,在一个类没有明确定义构造函数的时候,编译器不会有任何的函数调用来进行初始化操作,仅仅是移动栈顶留出对象所需空间,也就是说,这种情况下,编译器根本不会提供默认的构造函数。