sizeof(long) == sizeof(void*) 吗?
Posted
技术标签:
【中文标题】sizeof(long) == sizeof(void*) 吗?【英文标题】:Is sizeof(long) == sizeof(void*)? 【发布时间】:2020-08-24 22:53:10 【问题描述】:C 是否保证sizeof(long) == sizeof(void*)
?如果不是,为什么它在 Linux 内核源代码中被如此广泛地使用?
我查看了sizeof (int) == sizeof (void*)?,但那是在谈论sizeof(int)
与sizeof(void *)
。
【问题讨论】:
问:是什么让您认为“long”的答案与“int”的答案有什么不同???同样的答案,同样的原因:) 简单回答:否 你能举个例子说明它在linux内核中是如何使用的吗? 【参考方案1】:不,C 标准不保证sizeof(long) == sizeof(void *)
。
实际上,在 Windows 64 位系统上,sizeof(long)
的值为 4
,sizeof(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 *)
的代码,那么他们决定限制他们将支持的平台。这绝对没问题 - 您不必支持所有古怪的架构。
【讨论】:
以上是关于sizeof(long) == sizeof(void*) 吗?的主要内容,如果未能解决你的问题,请参考以下文章