sizeof(short) 不固定,c++标准仅要求≥16位、范围≥-32767~+32767;实际字节数由平台决定,常见2字节但可能为1、4字节;跨平台必须实测且用static_assert编译期校验,不可硬编码或依赖运行时assert。

sizeof(short) 在不同平台的结果不固定
它不是固定 2 字节,也不是固定 16 位 —— C++ 标准只要求 short 至少能表示 -32767 到 +32767(即 ≥16 位),具体占几个字节由编译器和目标平台决定。常见情况是 2 字节,但嵌入式或某些 DSP 平台可能为 4 字节,甚至极少数环境为 1 字节(需满足最小范围要求)。
所以不能靠“常识”硬记,必须实测,而且得在**你真正要部署的编译环境里测**。
- 用
sizeof(short)直接测,不是sizeof(short int)或sizeof(int16_t)—— 后两者语义不同 - 别在头文件里写死
#define SHORT_SIZE 2,跨平台时会崩 - 如果项目需严格二进制兼容(比如网络协议、内存映射文件),光看
sizeof不够,还得确认alignof(short)和符号扩展行为
怎么安全地测 short 大小:编译期断言比运行时打印更可靠
运行时 printf("%zu\n", sizeof(short)); 能看到值,但容易被忽略、没集成进 CI、无法阻止错误配置的构建。编译期强制校验才是工程实践中的底线。
推荐用 static_assert:
立即学习“C++免费学习笔记(深入)”;
static_assert(sizeof(short) == 2, "short must be 2 bytes for this protocol");
- 如果平台
short是 4 字节,编译直接失败,错误信息明确指向这行 - 别用
assert(sizeof(short) == 2)—— 运行时才检查,发布版可能被关掉 - 若需兼容多种大小(如支持 2B/4B
short),应改用int16_t或std::int16_t,它们才保证恰好 16 位
为什么 short 的大小会影响结构体布局和性能
short 的实际字节数直接改变结构体的 sizeof 和内存对齐,进而影响缓存行填充、序列化长度、DMA 传输块大小等底层行为。
例如:
struct Packet {
short id;
char flag;
short len;
};
- 若
short是 2 字节,典型对齐下sizeof(Packet)可能是 6 或 8(取决于填充) - 若
short是 4 字节,同样结构体很可能变成 12 字节,多出 50% 内存开销 - ARM Cortex-M3 默认
short是 2 字节,但某些 TI C2000 DSP 工具链设为 4 字节 —— 拿错头文件会导致通信帧解析全乱
别把 short 和 int16_t 当成一回事
short 是语言内置类型,大小可变;int16_t 是 <cstdint></cstdint> 定义的精确宽度整型,**仅当平台支持 16 位有符号整数时才存在**。二者不可互换假设。
-
sizeof(int16_t)在支持它的平台上恒为 2,但sizeof(short)不一定 - 某些旧平台(如部分 8 位单片机)没有
int16_t,因为硬件不支持高效 16 位运算 - 用
int16_t前务必加#ifdef INT16_MAX或静态断言,否则编译不过
short 就不该出现在 ABI 边界上 —— 它的大小太容易被编译器悄悄改掉。










