【问题标题】:Can sizeof(pointer) be used to find the machine type [duplicate]可以使用 sizeof(pointer) 查找机器类型吗?
【发布时间】:2015-02-16 03:50:21
【问题描述】:
if(sizeof(pointer) == 4) /* 4*8 = 32 bits */ 
printf("32 bit machine");

if(sizeof(pointer) == 8) /* 8*8 = 64 bits */
printf("64 bit machine");

这是否在任何平台上得到确认? 我的意思是我们可以依靠上述检查来确定它是哪种机器类型吗?

既然指针基本上是用来在 32 位机器中存储内存位置的,它应该是 4 个字节,而 64 位机器应该是 8 个字节?

sizeof(pointer) < 4 是否有可能在 32 位机器上。(1 个字是 32 位架构)

【问题讨论】:

  • 指针的大小在 64 位机器上应该是 64 位,我不确定 int 的大小。
  • @PaulGriffiths 不,这不是我想要的我的意思是我可以依靠上述条件吗?没有其他方法可以检查我的机器
  • @Gopi:链接问题的答案就在其中。像“32 位机器”和“64 位机器”这样的术语一开始就定义不明确,因此“任何平台”的答案都无法脱颖而出。
  • 此外,寻找一种完全可移植的方法来检测一些定义不明确的机器特征看起来有点像XY problem。在第一种情况下,您最好编写可在任何平台上运行的标准程序。其次,您最好关注您感兴趣的具体差异(例如long 的大小,您可以轻松获得),而不是假设“64 位机器”可能意味着什么。跨度>
  • @Maroun Maroun 有没有人放弃 int 字?^^

标签: c


【解决方案1】:

问题是 x 位机器的定义开始时有点模糊。我所知道的最常见的定义是 x 是该机器的通用寄存器的位数。

以 8086 为例:它被广泛认为是 16 位机器,因为它的寄存器是 16 位宽的。然而,一个指针是通过组合两个产生 20 位地址的寄存器形成的(因为 20/8 == 2.5 我猜编译器会四舍五入到 3 或 4 个字节;这取决于编译器)。

The C standard even allows pointers to different types to be of different sizes。所以有可能是sizeof(char*) != sizeof(myFunction),例如。

另外,有些机器支持不同的模式,例如 x86-64 机器支持执行 x86-32 代码。这使事情进一步复杂化。还有一个奇怪的老东西,叫做 nearfar 指针:pointers in Turbo C for x86-16 thus were 2 byte or 4 byte wide, depending on what they pointed to。还有Open Watcom compiler can give you 6-byte pointers on x86-32,如果它被定义为far

最后但并非最不重要的是字符大小。它被定义为 1。但是由多少 组成一个字符是另一回事:CHAR_BIT 宏告诉您它通常是 8,但在今天的一些 DSP 和一些以前的 CPU 上可能是7、9、16 甚至更多的值。如果 CHAR_BIT 是 16 并且指针是 32 位宽,那么在这样的机器上是 sizeof(void*) == 2

所以您不能依赖sizeof(pointer) 来确定机器的“CPU 大小”……但实际上,这通常是 Good Enough™。这取决于为什么您想要/需要这些信息。

【讨论】:

  • 我想让这个信息知道字的大小。 cpu 在一个周期内获取的位数。但似乎我不应该依赖这个。
  • 啊哈,这是一个不同的问题,但几乎一样难 :-) 恐怕在 C 语言中没有可移植的方法来查询它。标准没有定义任何需要的类型“单词”大小。根据编译器的不同,可能会有宏告诉你,但它不是可以以便携方式查询的。
  • 另请参阅this questionthis question 的答案。
【解决方案2】:

这肯定会为您提供指针的大小,以及在当前 CPU 模式下可以寻址的理论最大内存。

然而,并非指针中的所有位实际上都可用于寻址:当前的 64 位 CPU 仅使用 64 位指针的 48 位。同样,有些 CPU 仅使用 24 位寻址,而将指针存储在 32 位寄存器中。

另外,当前的 CPU 模式可能无法反映硬件的能力:64 位 CPU 具有兼容 32 位软件的模式。这样的软件永远无法检测到 64 位指针。

【讨论】:

  • 所以我们不能依赖上面的检查?
  • 如果目标是确定 CPU 类型,则不是。如果目标是确定当前的 CPU 模式,您的检查会给出一个上限,但不会更多。要获得有关硬件的真实信息,您必须询问内核,例如通过解析 /proc/cpuinfo 。
猜你喜欢
  • 2013-07-20
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
相关资源
最近更新 更多