c++ - 编译器在哪里存储 C++ 类的方法?

标签 c++ optimization compiler-construction

这比什么都更让人好奇......

假设我有一个 C++ 类 Kitty,如下所示:

class Kitty
{
    void Meow()
    {
        //Do stuff
    }
}

编译器是否将 Meow() 的代码放在 Kitty 的每个实例中?

显然,到处重复相同的代码需要更多的内存。但另一方面,在现代处理器上,分支到附近内存中的相对位置需要的汇编指令比分支到内存中的绝对位置更少,因此这可能更快。

我想这是一个实现细节,所以不同的编译器可能会有不同的表现。

请记住,我在这里不考虑静态或虚拟方法。

最佳答案

在通常的实现中,任何给定函数只有一个拷贝。给定对象实例的代码和数据之间的关联是通过传递隐藏参数(在函数中称为 this)建立的,该参数是指向对象实例(及其数据)的指针。

对于虚函数,事情变得有点复杂:每个类都有一个 vtable,其中包含一组指向虚函数的指针,每个对象都有一个指向其类的 vtable 的指针。通过查找 vtable 指针、查看正确的偏移量并调用该指针指向的函数来调用虚函数。

关于c++ - 编译器在哪里存储 C++ 类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2907797/

相关文章:

c++ - 为什么 lambda 函数默认删除推导的返回类型引用?

c++ - 浴室同步和线程队列

c++ - 如何将单个 32 位浮点加载到 AVX ymm 寄存器中的所有八个位置?

c++ - GNU 编译器优化

iphone - XCode编译器错误: ld: library not found for -loauth

c - 常量 C 表达式是在编译时还是在运行时求值?

c++ - GlobalAllocPtr() 总是为不同的进程返回相同的地址

c++ - 错误无效使用 void 表达式。试图将参数传递给函数

c++ - 在 C++/CLI 中从 native 转换为管理 unsigned short 的最快方法

c++ - O2 中导致 undefined symbol 的 gcc 优化标志