C++ 关于不同类型的sizeof()类
可能重复:C++ 关于不同类型的sizeof()类,c++,size,sizeof,C++,Size,Sizeof,可能重复: 为什么输出为8? 不sizeof(int)+sizeof(char)=5 class CBase { int a; char p; }; int main() { cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl; getchar(); } ///:~ class-CBase { INTA; charp; }; int main(){ cout内存通常由编译
为什么输出为
8
?不
sizeof(int)+sizeof(char)=5
class CBase
{
int a;
char p;
};
int main() {
cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl;
getchar();
} ///:~
class-CBase
{
INTA;
charp;
};
int main(){
cout内存通常由编译器对齐以获得更好的性能。因此,类或结构在内存中占用的空间可能大于其部分之和。内存通常由编译器对齐以获得更好的性能。因此,类或结构在内存中占用的空间可能大于其部分之和。看起来就像编译器/运行时一样与8字节边界对齐。您可能会发现,通过编译器或运行时开关可以改变这一点。例如,在AIX上,C++内存分配被对齐到16字节,这可能导致它们使用更多内存。
要避免这种对齐,有一种方法可以在运行时解决此问题(其缺点是应用程序无法使用VMX),只需在运行应用程序之前为其设置此环境变量:
export LIBCPP_NOVMX=1
看起来编译器/运行时已经对齐到8字节边界。您可能发现可以通过编译器或运行时开关来改变这一点。例如,在AIX上,C++内存分配被对齐到16字节,这可能导致它们使用更多内存。
要避免这种对齐,有一种方法可以在运行时解决此问题(其缺点是应用程序无法使用VMX),只需在运行应用程序之前为其设置此环境变量:
export LIBCPP_NOVMX=1
此处的更多说明-->此处的更多说明-->编译器不需要对齐到8个字节,它可能只想将int
s对齐到4个字节。编译器不需要对齐到8个字节,它可能只想将int
s对齐到4个字节。特别是在这种情况下:如果创建CBase
的数组,则下一个元素b在前一个字节结束后的下一个字节中开始。因此,为了确保a
在数组的每个元素中都是4对齐的,实现将CBase
填充为4的倍数。结构的大小始终是其对齐要求的倍数。特别是在这种情况下:如果创建CBase
的数组,则下一个元素在前一个结束后的下一个字节中开始。因此,为了确保a
在数组的每个元素中都是4对齐的,实现将CBase
填充为4的倍数。结构的大小始终是其对齐要求的倍数。