【问题标题】:Is sizeof(long) == sizeof(void*)?sizeof(long) == sizeof(void*) 吗?
【发布时间】:2021-12-04 02:55:45
【问题描述】:

C 是否保证sizeof(long) == sizeof(void*)?如果不是,为什么它在 Linux 内核源代码中被如此广泛地使用?

我查看了sizeof (int) == sizeof (void*)?,但那是关于sizeof(int) vs sizeof(void *)

【问题讨论】:

  • 问:是什么让您认为“long”的答案与“int”的答案有什么不同???同样的答案,同样的原因:)
  • 简单回答:否
  • 你能举个例子说明它在linux内核中是如何使用的吗?

标签: c linux-kernel


【解决方案1】:

不,C 标准不保证sizeof(long) == sizeof(void *)

实际上,在 Windows 64 位系统上,sizeof(long) 的值为 4sizeof(void *) 的值为 8。此设计符合 C 标准。另见What is the bit-size of long on 64-bit Windows?

那些实现 Linux 内核的人大概已经决定他们永远不会将代码移植到遵循 Windows 64 位 LLP64(long long 和指针是 64 位数量)系统的系统,因此不需要关心自己的大小是否不同。 32 位系统 (ILP32) 和 64 位系统 (LP64) 都有sizeof(long) == sizeof(void *)。但C标准不保证。

【讨论】:

  • 顺便说一句:Windows 是无关紧要的。它本来就是设计出来的。
  • IIRC [我可能错了],Windows 使用 LLP64 的原因是因为它最初的代码 int 是 16 位 [8086 使用 DOS,386 使用 win16]。因此,很多软件为了获得 32 位数字,使用了long。在我们使用 64 位机器之前,这很好。然后,为了保持向后兼容性,他们选择了破坏软件最少的模型。
  • @CraigEstey — 你所描述的内容与我对 Windows 如何最终到达的位置的理解非常吻合。
  • "将代码移植到...的系统" 没有抓住重点 - 这里,Linux 是系统它的 ABI,而不是C,将long定义为与指针大小相同。
  • @R..GitHubSTOPHELPINGICE Linux 是为 x86 设计的独立系统。 long 的大小和编写 Linux 操作系统的 ABI 严格来说是由特定的 x86 编译器端口决定的。将 Linux 移植到不同的 x86 编译器不会发生,因为代码库与 gcc 结合,严重依赖 gcc 特定的行为和非标准扩展。
【解决方案2】:

唯一的保证是:

  • void *char * 具有相同的大小和对齐方式;
  • 指向合格类型的指针与指向其不合格类型的指针(即sizeof (const int *) == sizeof (int *))具有相同的大小和对齐方式;
  • 所有struct 指针类型具有相同的大小和对齐方式;
  • 所有union 指针类型具有相同的大小和对齐方式;

就是这样。

如果 Linux 内核开发人员正在编写假定 sizeof (long) == sizeof (void *) 的代码,那么他们决定限制他们将支持的平台。这绝对没问题 - 您不必支持所有古怪的架构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 2013-09-19
    • 2013-09-24
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多