为什么 sizeof a class 在 C++ 中给出不同的输出?

Why does the sizeof a class give different output in C++?

根据 cppreference,

When applied to a reference type, the result is the size of the referenced type.

但是在下面的程序中,编译器给出了不同的输出。

#include <iostream>    
using namespace std;

class A 
{
    private:
        char ch;
        const char &ref = ch;
};

int main()
{
    cout<<sizeof(A)<<endl;
    return 0;
}

输出:

16

这里ch是字符类型,引用也是字符类型。所以输出将是 2 个字节而不是 16 个字节。

在线编译器:GDB

首先,您要的是对象的大小,而不是引用类型本身的大小。

sizeof(A::ref) 将等于 1:

class A 
{
    public:
        char ch;
        const char &ref = ch;
};

int main()
{
    cout<<sizeof(A::ref)<<endl;
    return 0;
}

对象大小为 16 因为:

  1. 对象内部的引用类型实际占用的大小等于指针的大小(本例中8)。
  2. 由于引用类型 object alignment 已增加到 8,因此 char 现在也占用 8 字节,即使它只真正使用 [= space.
  3. 的 13=] 字节

即如果您将 char ch 更改为 char ch[8]sizeof(A) 仍然等于 16:

class A 
{
    private:
        char ch[8];
        const char &ref = ch[0];
};

int main()
{
    cout<<sizeof(A)<<endl;
    return 0;
}