实例化C++类时,内存中会发生什么

Jo *_*her 6 c++ memory

我对C++的坚果和螺栓很感兴趣,我想知道在实例化对象时实际发生了什么变化.我特别感兴趣的是,如果函数随后被添加到内存中,如果它们来自运行时,或者根本不存储在内存中.

如果有人能指导我在C和C++的一些核心螺栓上找到一个好的网站,我也会喜欢它.

谢谢,乔

Jer*_*fin 8

不确定一个好的网站,但Inside C++对象模型是一本非常好的书.

至少在通常情况下,成员函数完全独立于类的任何实例.相反,类的实例是包含对象的(非静态)数据成员的结构.如果该类至少具有虚函数,则该对象还将包含指向vtable的指针,该指针基本上是指向函数的指针数组.

当调用成员函数时,该对象的地址作为隐藏参数传递给函数(许多编译器为它保留一个寄存器),并在函数中将其称为this.


MSa*_*ers 1

一个常见的情况是:

  1. 内存是通过调用分配的operator new。这个函数很可能已经在内存中了,它经常被需要。
  2. 调用该类的构造函数。该代码可能已经在内存中。如果不是,则调用此函数会出现页面错误。操作系统记录并将适当的页面从可执行文件加载到 RAM 中。然后它告诉操作系统重试。(2A. ctor 安排虚拟函数可调用 - 通常通过编写 vtable 指针)
  3. 带有构造函数的页面很可能还包含类的其他成员。然后也可以调用它们。但如果它们位于另一个页面上,调用它们可能会导致另一个页面错误和另一个加载。如果编译器将 vtable 放在不同的页面上,则使用该 vtable 也可能会导致页面错误。

这种按需加载机制的优点是,CPrinter如果用户从未打算打印其文档,操作系统可以避免加载类代码。