为什么 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
因为:
- 对象内部的引用类型实际占用的大小等于指针的大小(本例中
8
)。
- 由于引用类型 object alignment 已增加到
8
,因此 char
现在也占用 8
字节,即使它只真正使用 [= space. 的 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;
}
根据 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
因为:
- 对象内部的引用类型实际占用的大小等于指针的大小(本例中
8
)。 - 由于引用类型 object alignment 已增加到
8
,因此char
现在也占用8
字节,即使它只真正使用 [= space. 的 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;
}