使用size_t在C中检测64位

时间:2013-06-08 09:39:02

标签: c 64-bit portability

sizeof(size_t)==8相当于说平台是64位吗? 相反,sizeof(size_t)==4相当于说平台是32位吗?

更重要的是,在所有情况下,此测试 是否安全可靠 ,请记住操作系统和编译器的可移植性?是否存在一些奇怪的角落案例,包括可能遗漏size_t的潜在情况?

我有点担心只能为C99环境保证size_t

6 个答案:

答案 0 :(得分:8)

实际上,是的,这是安全可靠的。您可能在将来定位或永远定位的平台都是字节可寻址的,具有8位字节且size_t等于机器字长。大多数平台都保证无限期地保持这种情况(例如POSIX保证这一点)。

从理论上讲,不,这不安全可靠。诸如Cray-1,PDP-10和各种DSP系统之类的模糊系统将使您失望。但是,请考虑一下:你有没有机会为Cray-1设计软件,这个软件在坐在你旁边的初级工程师出生之前已经过时了?

答案 1 :(得分:5)

size_t是一种能够表示任何对象大小的数据类型。

64位通常是指64位可用于寻址虚拟内存的事实。在C中,使用指针来寻址内存。因此,sizeof(void*)似乎更适合测试64位环境。

但是,C标准无法保证这一点。可能存在一些模糊的情况,其中没有安全可靠的方法来确定使用C的硬件架构。

由于sizeof返回的大小是char大小的倍数,您可能需要查看CHAR_BIT(在 limits.h中定义)查看char中有多少位。

答案 2 :(得分:3)

  

更重要的是,在所有情况下,此测试是否安全可靠,并牢记操作系统和编译器的可移植性?

没有“可移植的方法”可以做到这一点,因为C标准让环境定义SIZE_MAX尽可能大(只要它大于65535)。但是C标准没有定义什么是“32位”和“64位”平台。

但是,在通用内存模型上,size_t在32位平台上为32位,在64位平台上为64位。

  

我有点担心只能为C99环境保证size_t

size_t也在C89中。因此,只要您的环境是标准环境,就应该定义size_t

答案 3 :(得分:0)

这里真正的问题是:如果sizeof(size_t) == 8sizeof(size_t) == 4都不是真的,你打算做什么。您还可以确保检查CHAR_BIT == 8 - 这可以避免混淆,如果平台不是“通用,现代硬件”,例如其他地方提到的Cray-1,PDP-10。

在未来的某个时刻,我预测将存在128位计算机,但我也猜测这是遥远的未来,因为我们目前只能使用64位中75%的可用位内存地址的机器(size_t与内存寻址有关)。请注意,高16位给出的内存比当前限制多65535倍,因此在内存空间不足之前还有很长的路要走。 [不用担心目前建造具有256TB内存的机器的成本,这是当前的限制 - 大多数系统甚至都没有接近DISKSPACE,更别担心RAM(粗略计算在我脑海中,但42位是4TB,所以48位应该是32倍,我认为)]。

答案 4 :(得分:0)

已经提到了

CHAR_BIT,并且理论上存在size_t内没有用于该值的额外填充。但是,您可以安全且可移植地计算运行时无符号整数类型的相关值位的确切数量。

size_t s;
int    num_of_bits;

for (s=1, num_of_bits=0; s!=0; s<<=1, num_of_bits++);

如果在编译时需要此信息,最好将#define SIZEOF_BITS 32设置为特定于平台的值,并在单元测试中验证它是否满足实际的num_of_bits。你有单元测试,对吧?

答案 5 :(得分:-1)

要检查指针,这是真的,但不是在运行时!如果您正在分发源代码,那就可以了。但是,如果要分发二进制文件,则不可靠。该值在编译期间确定。