为什么 class 的大小显示为 12 和 16 字节?

Why the size of class showing 12 and 16 byte?

我这里有五个 class,class A B C 我可以解释一下它们的大小。

class D 我期望结果是12 bytes,但输出是16 bytes,我发现原因是即加入虚函数后,对齐变为8 bytes,

所以我又创建了Test class,根据上面的推理,我的预期结果是16 bytes,但是运行之后的结果是 12 字节,

Testclass不应该也是8字节对齐,结果应该是16字节吗? 或者是什么导致 class 执行 8 字节 对齐?

代码:

#include <iostream>
using namespace std;

class A
{
    //empty
};

class B
{
    int a = 123;
};

class C
{
    public:
        void print(){
            cout << "C" << endl;
        }
    private:
        int i = 123;
};

class D
{
    public:
        virtual void print(){
            std::cout << "D" << std::endl;
        }
        virtual int d(){
            return 0;
        }
        void add(){
            std::cout << "D add" << std::endl;
        }
    private:
        int i;
};

class Test
{
    private:
        int i;
        int j;
        int l;
};
int main(){
    cout << sizeof(A) << endl;//1 byte:avoid null pointer
    
    cout << sizeof(B) << endl;//4 bytes:one int
    
    cout << sizeof(C) << endl;//4 bytes:one int

    cout << sizeof(D) << endl;//16 bytes(using 12byte):one int + one pointer and 8 alignment
    
    cout << sizeof(Test) << endl;//12 bytes:Why not 16 bytes?

    return 0;
}

class D I expect the result is 12 bytes, but the output is 16 bytes

你的期望被误导了。

I found the reason is that after adding the virtual function, the alignment will become 8 bytes,

就是这个原因。 12 没有对齐到 8 个字节。 16是。

So I created the Test class again, according to the above reasoning, my expected result is 16 bytes, but after running, the result is 12 bytes,

您没有向 Test 添加虚函数,所以您的期望是错误的。

Should not the Test class is also 8 bytes alignment,

没有理由期待这一点。

Or what causes the class to perform 8 bytes alignment?

在这种情况下,它是由具有虚拟成员函数引起的。在其他情况下,也可能是由于子对象的对齐方式为 8.