64位C++中的sizeof(long)

Ton*_*nyK 19 c++ 64-bit

我已经下载了MinGW-64,所以我现在可以使用g ++ 4.7.0(实验性)编译适用于Windows 7的64位程序.但是以下行:

cout << sizeof(long) << " " << sizeof(void*) << endl ;
Run Code Online (Sandbox Code Playgroud)

打印4 8,而不是8 8.g ++ 4.6.0的文档说:

64位环境将int设置为32位,将long设置为64位

有谁知道为什么sizeof(long)不是8?

编辑添加:我的困惑的来源是64位Windows的g ++ 4.7.0(还)是GNU编译器集合的官方部分.它是第一个带有32位的64位版本long,因此文档根本不适用于它.实际上,如果您访问相关网页,IA-32/x86-64的完整条目包括:

...

jal*_*alf 20

因为它不一定是.C++标准只要求(如果内存服务)至少32位宽,并且至少要大到int.

MSVC(以及Windows使用的ABI)定义long为32位宽,而MingW也是如此,因为编译器在与主机操作系统一致时更有用

  • 我知道.所以请阅读我的答案中的第一句话.最后一个.您找到的文档(我假设)描述了在x64上运行的Linux的ABI.它没有说明其他CPU(ARM,MIPS,Alpha,SPARC或其他任何东西),它没有说明不同操作系统的端口. (6认同)

Roe*_*yen 15

在Microsoft Windows操作系统上你有LLP64所以长的大小是32位.(见下表)

从维基百科引用:

在32位程序中,指针和数据类型(如整数)通常具有相同的长度; 在64位计算机上不一定如此.在C等编程语言中混合数据类型及其后代(如C++和Objective-C)可能因此在32位实现上起作用,但在64位实现上不起作用.在64位机器上用于C和C派生语言的许多编程环境中,"int"变量仍然是32位宽,但长整数和指针是64位宽.这些被描述为具有LP64数据模型.另一种选择是ILP64数据模型,其中所有三种数据类型都是64位宽,甚至是SILP64,其中"短"整数也是64位宽.但是,在大多数情况下,所需的修改相对较小且简单,并且可以简单地针对新环境重新编译许多编写良好的程序而无需进行更改.另一种替代方案是LLP64模型,它通过将int和long保留为32位来保持与32位代码的兼容性."LL"指的是"长整数"类型,在所有平台上至少为64位,包括32位环境.

Type           ILP64   LP64   LLP64
char              8      8       8
short            16     16      16
int              64     32      32
long             64     64      32
long long        64     64      64
pointer          64     64      64
Run Code Online (Sandbox Code Playgroud)

  • @RoelVanNyen:很少有人知道ILP64,LP64和LLP64的含义.那些知道的人不需要这个表;-)而且,没有Windows使用LLP64这一点的表是没用的. (3认同)
  • 这个表的意思是`long`大小是64位的系统有64位`long`. (2认同)
  • @flarn2006 当然,在提供它们的所有实现中,int32_t 是 32 位,int16_t 是 16 位。 (2认同)