关于“空struct的大小”你知道多少?
首先,看到空struct的大小我们就应该条件反射到:这个struct是指C语言中的还是C++中的!
1、核心差异
在C语言中,struct是用户自定义数据类型,而在C++中,struct是类对象;
C++的空类大小是1字节,而C的空结构体大小是未定义行为(但支持它的编译器通常设为0)。这是由两者的对象模型差异决定的。
2、为啥C++中struct大小要设置为1
- 对象地址唯一性:&obj1 != &obj2,0大小会导致数组元素地址重叠
EmptyClass arr[10];
// 若size=0,则arr[0]到arr[9]地址相同——违反语言基础规则
-
内存对齐安全: 避免出现零大小对象的内存布局冲突【因为对齐要求至少是1字节对齐(即地址能被1整除)】
-
继承体系完整性: 空基类需要占位空间支持派生类布局(可通过空基类优化规避)
3、C语言处理逻辑
- ISO C标准禁止空结构体(C99/C11 6.7.2.1)
- 编译器扩展(如GCC)将其设为0大小,因为:
- 无对象地址唯一性要求
- 常用于宏元编程中的占位符(如struct empty{})
- 类似零长度数组的"不存在"语义