Loading

关于“空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{})
    • 类似零长度数组的"不存在"语义
posted @ 2025-06-07 11:42  go__Ahead  阅读(34)  评论(0)    收藏  举报