![]() |
1
4
汇编程序不知道类是什么,它只汇编机器代码,偶尔宏也会抛出这些代码。就所有意图和目的而言,类完全是一个带有可选vftable的结构,所有处理和类“特殊特性”(虚拟化、多态性、inheiritanc等)都是在创建IR代码的中间阶段完成的。内存的分配将与结构、变量、数组或任何其他数据“blob”(静态或动态地,考虑对齐、常量和打包)相同,但用于处理基于堆栈和静态的dtor展开(在IR级别再次执行)的支持代码除外,和静态初始化(尽管静态初始化可能发生在多个类对象上)。我建议你把这本龙书通读一遍(前八章将涵盖它),以便更清楚地了解编译器和汇编程序是如何工作的,因为这些事情不是由汇编程序处理的,而是由编译器的前端和/或后端处理的,这取决于编译器的IL是如何构造的。 |
![]() |
2
3
(2)成员函数由编译器重写。考虑
那么编译器是怎么做的
现在考虑打电话给
编译器生成与此类似的代码(伪代码):
换句话说,编译器在
只有在实际引用非静态类成员变量时才会发生崩溃。
生成的崩溃报告还说明了问题(1)的答案。在很多情况下,你不会因为地址而崩溃
当您使用虚拟函数时,内存布局(通常)会发生一些变化。 |