为什么 sizeof(int) 在不同的操作系统中会有所不同?

Pra*_*ari 6 c c++ operating-system

我想知道为什么 int 的大小取决于 C 和 C++ 中使用的操作系统。如果指针的大小不同是可以的,但是为什么整数的大小不同呢?如果 16 位操作系统 sizeof(int) = 2 字节,则对于 32 位操作系统 sizeof(int) = 4 字节。为什么这样?

谢谢。

Fre*_*Foo 7

为什么这样?

历史原因。

在 ANSI C 标准出现之前和size_t1989 年,int它是用于索引数组的类型。malloc以 anint作为参数,strlen返回 one。因此int必须足够大以索引任何数组,但又必须足够小以免造成太多开销。对于文件偏移量,通常是较大的类型,例如longwas typedef'd to off_t

C 在 20 世纪 70 年代初首次在PDP-11上实现,int与处理器寄存器一样大:16 位。在VAX等较大的机器上,它被扩展到 32 位以允许更大的数组。

这一惯例已基本被放弃;C 和 C++ 标准使用size_tssize_t作为数组的索引和长度。在 64 位平台上,通常int仍然是 32 位宽,而size_t64 位宽。(不过,许多旧的 API,例如CBLAS,仍然用于int索引。)


Com*_* 10 2

根据C++标准

\n\n

1.7.1 规定:

\n\n
\n

C++内存模型中的基本存储单位是字节。一个字节至少足够大以包含基本执行字符集的任何成员...

\n
\n\n

那么 3.9.1.1 规定:

\n\n
\n

声明为字符 (char) 的对象应足够大以存储实现\xe2\x80\x99s 基本字符集的任何成员。

\n
\n\n

所以我们可以推断这char实际上是一个字节。最重要的是 3.9.1.2 还说:

\n\n
\n

有 \xef\xac\x81ve 有符号整数类型: \xe2\x80\x9csigned char\xe2\x80\x9d、\xe2\x80\x9cshort int\xe2\x80\x9d、\xe2\x80\x9cint\xe2\x80 \x9d、\n \xe2\x80\x9clong int\xe2\x80\x9d 和 \xe2\x80\x9clong long int\xe2\x80\x9d。在此列表中,每种类型至少提供与其前面的列表一样多的存储空间。普通整数具有执行环境架构建议的自然大小;提供其他有符号整数类型以满足特殊需求。

\n
\n\n

因此,换句话说,大小int(a) 保证至少为一个字节,(b) 自然地与其运行的操作系统/硬件对齐,因此现在很可能是 64 位或(对于许多旧系统)32 位。

\n