空数组在标准C++中不可定义,所谓“空数组”实为零长数组(GNU扩展)、std::array<T, 0>(占T对齐字节,如int通常4或8)或std::vector<T>空实例(通常24或32字节),其大小需用sizeof实测。

空数组在C++里根本不能定义
标准C++不允许声明长度为0的内置数组,比如 int arr[0]; 是非法的,编译器会直接报错(GCC/Clang报 error: zero-size array,MSVC可能允许但属扩展行为)。所谓“空数组”通常指三种情况:零长数组(GNU扩展)、std::array<T, 0>、或 std::vector<T> 的空实例。它们的内存占用完全不同,不能一概而论。
std::array<int, 0> 占0字节,但有对齐开销
std::array 是聚合类型,长度为0时内部无元素存储,但整个对象仍需满足其值类型的对齐要求。例如:
static_assert(sizeof(std::array<int, 0>) == sizeof(int)); // 通常为4或8,取决于平台对齐
这是因为标准要求 std::array 的地址可转换为指向其首个元素的指针(即使没有元素),所以它必须至少对齐到 T 的对齐边界。实际大小由编译器决定,可用 sizeof 直接查:
- 写
std::cout << sizeof(std::array<char, 0>);→ 通常是1(char对齐为1) - 写
std::cout << sizeof(std::array<double, 0>);→ 通常是8(x64下double对齐为8) - 注意:该大小不含动态分配内存,纯栈上对象尺寸
std::vector<int> 空实例通常占24或32字节
std::vector 是动态容器,空时仍需维护三个指针(或等效结构):指向数据的指针、size、capacity。在主流libstdc++或libc++实现中:
立即学习“C++免费学习笔记(深入)”;
- x86_64 Linux(libstdc++):
sizeof(std::vector<int>)一般是24 - macOS(libc++):
sizeof(std::vector<int>)也常是24 - 某些带调试检查的构建可能更大,但和元素数量无关
- 它不包含堆内存(空vector的
data()为nullptr),所以sizeof只反映控制块大小
验证方法就是直接打印:std::cout << sizeof(std::vector<int>);
用 sizeof 查尺寸,别信“理论值”
不同标准库实现、编译器、平台甚至优化等级都可能影响空容器的实际大小。比如 std::array<void*, 0> 在某些ABI下可能因指针对齐变成16字节。最可靠的做法永远是:
- 在目标编译环境下,用
sizeof实测 - 用
alignof检查对齐要求(如alignof(std::array<double, 0>)) - 避免依赖具体数值——尤其跨平台时,只依赖标准保证(如
std::array空时无元素存储) - 如果真需要0字节对象,
struct {}是唯一标准方式,sizeof确保为1
真正容易被忽略的是:对齐要求可能让“逻辑上空”的对象物理尺寸不为0,而 sizeof 返回的就是这个物理尺寸,不是你脑补的“应该占多少”。


















