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) 的值为 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 *) 的代码,那么他们决定限制他们将支持的平台。这绝对没问题 - 您不必支持所有古怪的架构。

【讨论】:

以上是关于sizeof(long) == sizeof(void*) 吗?的主要内容,如果未能解决你的问题,请参考以下文章

C++sizeof的各种玩法

浅谈: sizeof()与指针

c语言中,为啥在64位系统中long跟指针的大小是8,而32位的却是4?是啥导致不一样?求详细解答

c语言 sizeof理解

char、int、long它们各占几个字节?占几位?

64位机器中的C++ int vs long long