C编译器如何创建对象?
在这样的C代码中:
{ int i = 5; /* ....... */ } 编译器将通过向下移动堆栈指针(对于堆栈向下)移动int的大小来替换代码,并将值5放在该内存位置. 同样,在C代码中,如果创建了一个对象,编译器会做什么?例如: class b { public : int p; virtual void fun(); }; main() { b obj; } 编译器会为上面的代码做些什么?任何人都可以解释何时分配内存,何时分配虚拟表的内存,以及何时调用默认构造函数? 解决方法
论建筑
从逻辑上讲,两者之间没有区别: 在这两种情况下,堆栈都足够大以容纳对象,并在对象上调用构造函数. 请注意: > POD类型的构造函数不执行任何操作. 你可以这样思考: 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类型的构造函数非常简单,编译器会进行大量的优化(并且可能除了删除任何实际的代码甚至内存地址),但从逻辑上讲,以这种方式考虑它是很好的. 注意:所有类型都有一个复制构造函数(如果不这样,编译器会定义一个)和POD类型,你可以在逻辑上把它看作是复制构造而没有任何问题. 至于虚拟表: 首先请注意,这是一个实现细节,并非所有编译器都使用它们. 注意:定义何时设置vtable是不可能的,因为标准没有定义,因此每个编译器可以随时自由地执行.如果你有一个多级层次结构,那么vtable可能是由每个构造函数从基数到大多数派生的,因此可能是错误的,直到最终的构造函数完成. 注意:您无法在构造函数/析构函数中调用虚函数.所以你可以说只有在构造函数完全完成后才能正确初始化vtable. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 【Flex Viewer】 开发教程(1)Flex Viewer配置文件
- ruby-on-rails – 无法加载’active_record / connection_a
- 在Xcode 6 / iOS 8中如何全局导入文件的方式有变化吗?
- 红宝石 – 应该在系统范围内还是在用户层面安装rbenv?
- vb如何将数据库中某个字段显示在一个文本框
- [React] Extend styles with styled-components in React
- Vue.js第四天学习笔记(组件)
- UML中的聚合
- reporting-services – 聚合函数“Aggregate”不能在包含任
- 受保护的枚举在C#中不可能