仅功能对象的内存结构?

Luc*_*cas 8 c++

假设我们有一个看起来像这样的类:

class A 
{ 
    public:
        int FuncA( int x );
        int FuncB( int y );

        int a;
        int b;
};
Run Code Online (Sandbox Code Playgroud)

现在,我知道这个类的对象将只用这两个对象在内存中进行布局ints.也就是说,如果我创建一个类实例的向量A,则ints一个实例将有两个实例,然后ints是第二个实例的两个实例.对象是POD.

但是让我们说这个课程看起来像这样:

class B
{ 
    public:
        int FuncA( int x );
        int FuncB( int y );
};
Run Code Online (Sandbox Code Playgroud)

这个类的对象在内存中看起来像什么?如果我用向量中的实例填充B向量?向量中有什么?我被告知非虚拟成员函数最终被编译为自由函数,这些函数与声明它们的类的实例完全无关(虚函数也是,但是对象存储带有函数指针的vtable) .访问限制仅仅是语义上的"人"级别.只有类(和vtable等)的数据成员实际上构成了对象的内存结构.

那么,类的对象B在内存中看起来又是什么样的呢?它是某种占位符价值吗?必须有东西,我可以拿对象的地址.它必须指向一些东西.无论是什么,编译器是否允许内联/优化这些对象并将方法调用视为正常的自由函数调用?如果我创建这些的向量并在每个对象上调用相同的方法,编译器是否可以消除向量并用一堆普通调用替换它?

我只是好奇.

Fer*_*cio 7

保证C++中的所有对象都具有sizeof> = 1,以便每个对象都具有唯一的地址.

我没有尝试过,但我想在你的例子中,编译器会为数组/向量中的每个函数对象分配但不初始化1个字节.


Jam*_*ran 6

正如Ferruccio所说,C++中的所有对象都保证大小至少为1.大多数情况下,它只有1个字节,但填写了对齐的大小,但无论如何.

但是,当用作基类时,它不需要填充任何空格,因此:

class A  {} a;    // a is 1 byte.
class B  {} b;    // b is 1 byte.
class C  { A a; B b;} c; // c is 2 bytes.
class D : public A, B { } d;  // d is 1 byte.
class E : public A, B { char ee; } e;  // e is only 1 byte
Run Code Online (Sandbox Code Playgroud)