【问题标题】:Is sizeof(int) always equal to sizeof(void*) [duplicate]sizeof(int) 是否总是等于 sizeof(void*) [重复]
【发布时间】:2012-02-11 21:59:08
【问题描述】:

可能重复:
sizeof (int) == sizeof (void*)?

我想知道是否可以保证,在 32 位和 64 位系统中,sizeof(int) 始终等于 sizeof(void*)(即分别为 32 位和 64 位)。

此外,我需要知道是否始终保证 long int 可以同时容纳 intvoid* 的位,例如

long int lint = (((int)integer)<<sizeof(int)) | (void*)ptr;

【问题讨论】:

  • long intint 实际上在许多平台上具有 相同 大小。
  • (((int)integer)&lt;&lt;sizeof(int)) | (void*)ptr 永远无法工作的首要原因是&lt;&lt; 移动位,sizeof(int) 以字节表示。
  • 保证 sizeof (long int) >= sizeof (int)
  • 也许如果您告诉我们您真正想要完成什么,我们可以用一些更准确的解决方案来回答。
  • @AndréCaron:“否”非常准确:)

标签: c++


【解决方案1】:

我想知道是否保证在 32 位和 64 位系统中,sizeof(int) 始终等于 sizeof(void*)

没有。

我需要知道是否始终保证 long int 可以同时容纳 intvoid* 的位

没有。一个快速的证明是在许多现代平台上考虑sizeof(long int) == sizeof(int),可能包括您正在使用的平台。

更重要的问题是为什么你认为你“需要知道”这个;您提出此类问题的事实让我担心您的代码可能会......不稳定。

【讨论】:

  • 以第一个“否”为例:使用 gcc sizeof(int) 在 64 位平台上是 4(而 sizeof(void*) 当然是 8)。
【解决方案2】:

int 的大小取决于实现,尽管在许多系统中它可能等于指针的大小,但不能保证。

如果您决定需要依赖于此的代码,则可以包含以下内容:

if (sizeof(int) != sizeof(void *))
{
    fprintf(stderr, "ERROR: size assumptions are invalid; this program cannot continue.\n");
    exit(-1);
}

【讨论】:

  • 唉,不——预处理器不知道某物的大小。我会编辑;谢谢。
  • 就我个人而言,我不喜欢 assert(),因为我经常看到 #if'd out of non-debug 版本。
  • 为什么不static_assert?这个假设在运行时不会改变。
【解决方案3】:

我想知道是否可以保证,在 32 位和 64 位系统中,sizeof(int) 始终等于 sizeof(void*)(即分别为 32 位和 64 位)。

没有。

另外,我需要知道是否始终保证 long int 可以同时容纳 int 和 void* 的位

没有。

你要找的是:std::intptr_t

sizeof(std::intptr_t) == sizeof(void*)

std::intptr_t 定义为一个大小足以容纳指针的整数。

从技术上讲,它是标准的可选部分。
但是你通常可以在头文件中找到&lt;cstdint&gt; 参见:18.4.1 Header &lt;cstdint&gt; synopsis [cstdint.syn]

【讨论】:

    【解决方案4】:

    最近的 C99 标准提供了一个 &lt;stdint.h&gt; 标头,该标头定义了一个保证与指针具有相同大小的 intptr_t 整数类型。

    在我的 Debian/AMD64/Sid 上,sizeof(int) 是 4 个字节,但 sizeof(void*)sizeof(intptr_t)sizeof(long) 都是 8 个字节。

    【讨论】:

      猜你喜欢
      • 2012-02-13
      • 2019-02-12
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 2012-08-03
      • 2010-09-28
      相关资源
      最近更新 更多