写程序的时候,大家可能都用过 int、short、long 这些整数类型。但你有没有想过,它们到底在内存里占了多少地方?这可不是小事,尤其在处理大量数据时,一个类型选错,内存用量可能差好几倍。
常见的整数类型和它们的“体重”
在 C/C++ 这类语言里,整数类型的大小是固定的,由编译器和系统架构决定。比如在 64 位 Windows 系统上,常用的类型占用如下:
- char:1 字节(8 位)
- short:2 字节(16 位)
- int:4 字节(32 位)
- long:4 字节(32 位,Windows 上)
- long long:8 字节(64 位)
注意,long 在不同系统上可能不一样。Linux 64 位下,long 是 8 字节,而 Windows 是 4 字节。这种差异很容易让人踩坑。
举个实际例子
假设你要存 100 万个学生的年龄。年龄最大也就 200 岁以内,用 short(-32768 到 32767)完全够用。如果傻乎乎地全用 int,每个数多占 2 字节,总共就是 100 万 × 2 = 200 万字节,差不多白白多用了 2MB 内存。
再狠一点,如果是个嵌入式设备,内存只有几 MB,这种浪费就真扛不住了。
代码里怎么查?
不确定某个类型的大小?直接用 sizeof 就行:
#include <stdio.h>
int main() {
printf("int: %zu 字节\n", sizeof(int));
printf("short: %zu 字节\n", sizeof(short));
printf("long long: %zu 字节\n", sizeof(long long));
return 0;
}
输出结果会告诉你当前平台下的真实占用。
别忘了无符号类型
有时候你确定不会存负数,比如计数、ID 编号,就可以用 unsigned int 或 unsigned short。它们的范围变成从 0 开始,能表示更大的正数,而且内存占用不变。
比如,一个 byte 的 char 范围是 -128 到 127,而 unsigned char 就是 0 到 255,刚好适合存像素值、状态码这类数据。
编程语言之间的差异
Java 就比较省心,int 固定 4 字节,long 固定 8 字节,不管什么平台都一样。Python 则更灵活,int 类型可以自动扩展,但代价是每个整数对象本身有额外开销,远不止几个字节。
所以 Python 处理一亿个整数时,内存暴涨并不稀奇——每个数背后都是个对象,附带引用计数、类型指针等信息。
小选择,大影响
别觉得省几个字节没啥用。当你在做高频交易系统、游戏服务器、物联网设备时,内存效率直接关系到响应速度和硬件成本。一个 int 换成 short,数组小一半,缓存命中率提升,性能自然上来。
下次定义变量前,不妨多问一句:这个数真的需要 4 字节吗?