大佬教程收集整理的这篇文章主要介绍了C编译器如何创建对象?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
{ int i = 5; /* ....... */ }
编译器将通过向下移动堆栈指针(对于堆栈向下)移动int的大小来替换代码,并将值5放在该内存位置.
同样,在C代码中,如果创建了@L_607_4@对象,编译器会做什么?例如:
class b { public : int p; virtual void fun(); }; main() { b obj; }
从逻辑上讲,两者之间没有区别:
在这两种情况下,堆栈都足够大以容纳对象,并在对象上调用构造函数.
请注意:
> POD类型的构造函数不执行任何操作.
>没有构造函数的用户定义类型具有编译器生成的默认cosntructor.
你可以这样思考:
int x; // stack frame increased by sizeof(int) default construct (do nothing) B a; // stack frame increased by sizeof(B) default construct.
而:
int y(6); // stack frame increased by sizeof(int) Copy constructor called B b(a); // stack frame increased by sizeof(B) Copy constructor called
好.当然,POD类型的构造函数非常简单,编译器会进行大量的优化(并且可能除了删除任何实际的代码甚至内存地址),但从逻辑上讲,以这种方式考虑它是很好的.
注意:所有类型都有@L_607_4@复制构造函数(如果不这样,编译器会定义@L_607_4@)和POD类型,你可以在逻辑上把它看作是复制构造而没有任何问题.
至于虚拟表:
首先请注意,这是@L_607_4@实现细节,并非所有编译器都使用它们.
但是vtable本身通常是在编译时生成的.任何需要vtable的对象都有@L_607_4@不可见的指针添加到结构中(这是作为对象大小的一部分包含的).然后在构造期间,指针被设置为指向vtable.
注意:定义何时设置vtable是不可能的,因为标准没有定义,因此每个编译器可以随时自由地执行.如果你有@L_607_4@多级层次结构,那么vtable可能是由每个构造函数从基数到大多数派生的,因此可能是错误的,直到最终的构造函数完成.
以上是大佬教程为你收集整理的C编译器如何创建对象?全部内容,希望文章能够帮你解决C编译器如何创建对象?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。