sizeof(short) 返回字节数而非位数,标准仅保证其不小于 sizeof(char) 且通常≥2,但不可假设恒为2。

sizeof(short) 返回的是字节数,不是位数
很多人看到 short 就默认是 16 位,然后直接写 sizeof(short) == 2 做判断——这在 x86/x64 上通常成立,但标准只保证 sizeof(short) >= sizeof(char) 且 sizeof(short) 。实际值由编译器和 ABI 决定。
实操建议:
- 用
sizeof(short)获取运行时真实字节数,别硬编码假设为 2 - 需要确切宽度时,优先用
int16_t(来自<cstdint>),它明确是 16 位有符号整数 - 在嵌入式或跨平台项目里,
short可能是 4 字节(比如某些 DSP 或老 ARM 编译器)
sizeof(short) 和 sizeof(short int) 完全等价
C++ 标准规定 short 是 short int 的简写,二者类型完全相同,sizeof 结果必然一致。不会出现一个 2 字节、另一个 4 字节的情况。
常见错误现象:
立即学习“C++免费学习笔记(深入)”;
- 误以为
short int比short“更完整”,从而在类型声明里多写int——纯属冗余,还可能干扰模板匹配 - 在文档或注释里写“
short int占 2 字节”,却不提short也一样,造成读者困惑
在结构体里用 sizeof(short) 要小心对齐影响
sizeof(short) 自身返回的是该类型的大小,但放在结构体中,它的实际占用空间可能因对齐而扩大。比如在 4 字节对齐的平台上,char + short 的结构体大小可能不是 3,而是 4 或 6。
实操建议:
- 用
alignof(short)查看其对齐要求,它常等于sizeof(short),但不绝对 - 结构体总大小 ≠ 各成员
sizeof之和,得用sizeof(YourStruct)实测 - 想压缩空间?把小类型(如
char)集中放前面,避免short被强制填充
sizeof(short) 在模板和 constexpr 中可直接用
sizeof 是编译期运算符,sizeof(short) 可用于 constexpr 表达式、模板非类型参数、数组维度等场景,没有运行时开销。
使用示例:
constexpr size_t SHORT_BYTES = sizeof(short);
template<size_t N = SHORT_BYTES>
struct PackedData { char buf[N]; };
注意点:
- 不能写
sizeof(short int)当作模板参数名(含空格非法),但sizeof(short)没问题 - 不同平台下该值可能不同,所以基于它的模板实例化结果也会不同——跨平台时得留意
真正容易被忽略的是:你写的 sizeof(short) 看似简单,但它背后绑定的是整个编译环境的 ABI。改个编译器、换条指令集、切个 C++ 标准版本,都可能让结果变掉。别把它当成常量来信任,除非你控制了全部构建条件。










