9

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

更重要的是,考虑到操作系统和编译器的可移植性,这个测试在所有情况下是否安全可靠?是否有一些奇怪的极端情况,包括可能丢失的潜在情况size_t

我有点担心这size_t可能只适用于 C99 环境。

4

6 回答 6

8

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

从理论上讲,不,这并不安全可靠。Cray-1、PDP-10 和各种 DSP 系统等不起眼的系统会让您大吃一惊。但是,请考虑一下:您为 Cray-1 设计软件的可能性有多大,在坐在您旁边的初级工程师出生之前就已经过时了?

于 2013-06-08T09:47:23.893 回答
6

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

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

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

因为sizeof将大小返回为 a 大小的倍数char,您可能需要查看(在limits.hCHAR_BIT中定义)以查看 char 中有多少位。

于 2013-06-08T09:53:32.823 回答
4

更重要的是,考虑到操作系统和编译器的可移植性,这个测试在所有情况下是否安全可靠?

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

但是,在常见的内存模型上,size_t在 32 位平台上是 32 位,在 64 位平台上是 64 位。

我有点担心这size_t可能只适用于 C99 环境。

size_t也在 C89 中。所以,只要你的环境是标准的,它就应该定义size_t.

于 2013-06-08T09:47:12.943 回答
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 倍)]。

于 2013-06-08T10:02:20.270 回答
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++);

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

于 2013-06-08T10:21:19.617 回答
-1

To check the pointer, this is true, but not in the runtime! Say if you're distributing the source code, it's works. However if you are distributing the binary, it is not reliable. The value is determined during the compile time.

于 2013-06-08T10:29:01.003 回答