我已经下载了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也是如此,因为编译器在与主机操作系统一致时更有用
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)