short 在 c++ 中不保证为 2 字节,仅保证 ≥16 位;short 与 short int 完全等价;需确定宽度时应使用 int16_t;盲目用 short 省内存可能降低性能或增加对齐开销。

short 在 C++ 中通常是 2 字节,但不保证
标准只规定 short 至少能表示 −32767 到 +32767(即 ≥16 位),实际大小由编译器和平台决定。绝大多数主流环境(x86/x64 上的 GCC、Clang、MSVC)确实把 short 实现为 2 字节(16 位),但你不能在跨平台代码里硬编码 sizeof(short) == 2。
常见错误现象:
— 把 short 当作“一定 2 字节”来写二进制序列化逻辑,结果在某些嵌入式平台或旧 DSP 编译器上出错;
— 用 short 存网络包头字段并假设固定长度,导致解析失败。
实操建议:
• 检查当前平台:打印 sizeof(short) 或查 limits.h 中的 SHRT_MAX
• 需要确定宽度时,优先用 int16_t(需 #include <cstdint></cstdint>),它明确是 16 位补码整数
• 若依赖 ABI(如与 C 库交互),以目标平台文档为准,而非本地测试结果
short 和 short int 完全等价,别被名字骗了
short 就是 short int 的简写,两者语义、大小、对齐方式完全一致。C++ 标准里没有独立的 “short int 类型”,只有 “short” 这个类型名,int 是可省略的冗余关键字。
立即学习“C++免费学习笔记(深入)”;
使用场景:
— 函数签名里写 void f(short x) 和 void f(short int x) 没任何区别
— typedef 或模板推导中,decltype(0s) 得到的是 short,不是 short int
容易踩的坑:
• 在头文件里混用两种写法,造成风格不一致,但更严重的是误导新人以为它们有区别
• 误以为 signed short int 和 unsigned short int 是不同底层类型 —— 实际上 signed 是默认且可省略的,unsigned short 才是另一个独立类型
sizeof(short) 可能 ≠ sizeof(short int)?不,它永远相等
这个问题本身是个伪命题:short int 不是新类型,只是 short 的全称写法。所以 sizeof(short) 和 sizeof(short int) 在任何合法 C++ 程序中必然相等 —— 它们指代同一个类型。
为什么有人会怀疑不等?
• 看到 long long 和 long long int 并存,误推所有组合都可能有差异
• 把 short unsigned int(合法)和 short int unsigned(语法错误)搞混,产生类型歧义幻觉
实操建议:
• 编译器报错时注意看类型名展开(比如 Clang 会显示 short 而非 short int)
• 用 typeid(T).name() 或 std::is_same_v<short short int></short> 验证,结果恒为 true
别用 short 省内存,除非你真测过
在现代 x86/x64 上,short 通常不会比 int 更快,甚至可能更慢:CPU 寄存器是 32/64 位的,读写 short 往往要额外的 zero-extend 或 sign-extend 指令;结构体里盲目用 short 还可能因对齐反而浪费空间。
性能 / 兼容性影响:
• 数组连续访问时,short[1000] 比 int[1000] 占内存少一半,缓存友好性可能提升
• 但单个变量运算,short 和 int 在大多数情况下生成几乎相同的汇编
• ARM Cortex-M 等嵌入式平台对 short 支持较好,值得考虑
实操建议:
• 先用 int 写逻辑,profile 确认内存或缓存是瓶颈后再改
• 结构体成员排序按大小降序排(int, short, char),比乱用 short 更有效减少 padding
• 避免在循环计数器、索引、函数参数中用 short —— 隐式提升到 int 的开销不值得










