关于sizeof(空struct和空class)

本文探讨了不同编译环境下空结构体和空类的sizeof值差异,在Windows VC6.0与Linux gcc环境中,展示了C及C++语言中空结构体与空类的内存占用特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

问:sizeof(empty_struct)

sizeof(empty_class)的大小分别是多少?

 

1. Windows平台下,VC6.0编译环境: 

空结构体C文件中,无法编译通过;

CPP文件中,分别输出11

 

 

2.Linuxgcc编译 

C文件中,sizeof(empty_struct) = 0

C++文件中,sizeof(empty_struct) = 1

sizeof(empty_class) = 1

 

 

 

### 结构体大小计算 在C/C++中,`sizeof`用于获取数据类型的大小。对于结构体而言,其大小不仅取决于成员变量所占的间,还受到编译器填充(padding)对齐方式的影响。 #### 成员排列与内存布局 考虑如下结构体定义: ```cpp struct S1 { char c; int i; }; ``` 尽管`char`仅占用1个字节而`int`通常占用4个字节,实际输出显示该结构体的总大小为8字节[^1]。这是因为为了提高访问效率,编译器会对结构体内存进行适当调整,使得每个成员相对于结构体起始地址保持特定边界对齐。 #### 对齐规则 当多个不同类型的数据项组合成一个复合对象时,它们之间可能存在隙以满足各自类型的最佳性能需求。具体来说: - 数据成员按照声明顺序依次存储; - 编译器会在必要处插入额外间来确保后续字段能够按预期对齐; - 整个结构体本身也会被扩展到某个最小单位倍数上结束。 例如给定另一个类实例: ```cpp class B { private: bool m_aTemp; // 一般认为bool占1字节 int m_nTemp; // int通常是4字节 bool m_bTemp; }; cout << sizeof(B) << endl; // 输出应为12, 其中是以最长的为对齐长度,即int的字节数4。 // 将m_aTemp的1补齐至4;同理处理下一个bool成员, // 总计得到12字节的结果[^4]. ``` 这里可以看到即使两个布尔型只用了两字节的有效载荷,但由于中间加入了足够的填充使整数可以四字节对齐,最终整个结构体尺寸达到了十二字节。 #### 影响因素总结 影响结构体大小的主要因素有三个方面: - **平台架构**:不同操作系统或硬件环境下的基本类型可能有不同的默认宽度。 - **编译选项**:某些情况下可以通过命令行参数改变默认行为。 - **编程习惯**:合理安排成员次序可以帮助减少不必要的内部碎片化浪费。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值