sizeof(long)是否等于sizeof(void*)?

5

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

我查看了sizeof(int) == sizeof(void*)?,但它只讨论了sizeof(int)sizeof(void *)的区别。


2
你觉得“long”类型的答案与“int”类型的答案有什么不同吗?其实是相同的答案和原因 :) - paulsm4
6
简单回答:不。 - klutt
2
你能举个例子说明它在Linux内核中的使用吗? - klutt
2个回答

11
不,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标准并没有保证这一点。

1
顺便说一句:Windows 是无关紧要的。它就是被设计成这样的。 - wildplasser
1
如果我没记错的话,Windows选择LLP64的原因是因为它最初的代码中“int”是16位的[在DOS下使用8086和win16下使用386]。因此,为了获得32位数字,许多软件使用了“long”。这很好,直到我们遇到64位机器。然后,为了保持向后兼容性,他们选择了破坏最少量软件的模型。 - Craig Estey
@CraigEstey - 你所描述的与我对Windows发展历程的理解相当吻合。 - Jonathan Leffler
@R..GitHubSTOPHELPINGICE Linux是为x86设计的独立系统。长整型的大小和编写Linux操作系统的ABI严格来说是由特定的x86编译器端口确定的。将Linux移植到不同的x86编译器是不可能的,因为代码库与gcc紧密结合,严重依赖于gcc特定的行为和非标准扩展。 - Lundin
指针在64位架构中必须是64位数量。可以改变的是long的大小。再次强调,它们不需要相同。在Linux 64位系统中,long为64位,指针也是64位。 - Luis Colorado
显示剩余2条评论

3
唯一的保证是:
  • void *char * 具有相同的大小和对齐方式;
  • 指向限定类型的指针与指向其未限定等效物的指针具有相同的大小和对齐方式(即sizeof (const int *) == sizeof (int *));
  • 所有struct 指针类型具有相同的大小和对齐方式;
  • 所有union 指针类型具有相同的大小和对齐方式;
就是这些。
如果Linux内核开发人员编写的代码假设sizeof (long) == sizeof (void *),那么他们已经决定限制他们要支持的平台。这完全没问题——你不必支持每个奇怪的架构。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接