C++编译器 - 解析类成员的名称

the*_*tor 3 c++ compiler-construction

当编译器看到这段代码时:

SomeClass foo;
int x = foo.bar;
Run Code Online (Sandbox Code Playgroud)

检索bar值的过程是什么?即它看一些表示类定义的数据结构?如果是这样的数据结构是在编译时还是在运行时生成的?

GMa*_*ckG 6

编译器的地址为foo.在该地址处,有足够的空间用于成员变量(sizeof(SomeClass)),其中可能包含一些填充.

它知道`bar在类中的某个位置(通常是它们被声明的顺序,加上一些其他魔法,如继承),并跳转到该偏移量.

那是:

struct SomeClass
{
    short s;
    float f;
    int bar;
    char *c;
}

// pseudo-code:
&SomeClass.bar == (&SomeClass) + sizeof(short) + sizeof(float);
Run Code Online (Sandbox Code Playgroud)

在运行时,它获取该数据并将其分配给 x

  • 这在技术上是不准确的.编译器(通常)不将foo.bar分配给x.编译器生成机器指令,在运行时将foo.bar分配给x. (2认同)