C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了C编译器如何创建对象?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在这样的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可能是由每个构造函数从基数到大多数派生的,因此可能是错误的,直到最终的构造函数完成.

注意:您无法在构造函数/析构函数调用函数.所以你可以说只有在构造函数完全完成后才能正确初始化vtable.

大佬总结

以上是大佬教程为你收集整理的C编译器如何创建对象?全部内容,希望文章能够帮你解决C编译器如何创建对象?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。