我已经下载了MinGW-64,所以我现在可以使用g ++ 4.7.0(实验性)编译适用于Windows 7的64位程序。但是以下一行:
cout << sizeof(long) << " " << sizeof(void*) << endl ;
打印4 8
,而不是8 8
。 g ++ 4.6.0的文档说:
64位环境将int设置为32位且长,指针指向64位
有人知道为什么sizeof(long)
不是8?
编辑添加:我感到困惑的原因是64位Windows的g ++ 4.7.0还不是GNU Compiler Collection的官方部分。它是第一个带有32位long
的64位版本,因此文档根本不适用于它。实际上,如果你转到relevant web page, IA-32 / x86-64 的完整条目包括:
...
答案 0 :(得分:17)
因为它不一定是。 C ++标准只要求(如果内存服务)至少32位宽,并且至少与int
一样大。
MSVC(以及Windows使用的ABI)将long
定义为32位宽,而MingW也是如此,因为编译器在与主机操作系统一致时更有用
答案 1 :(得分:13)
在微软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”是指“long long integer”类型,在所有平台上至少为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
答案 2 :(得分:2)
MinGW旨在构建WIN32应用程序,WIN32标头/库假定长(或LONG)类型为32位宽,即使在64位Windows上也是如此。 Microsoft决定,否则应该更改现有的Windows源代码。例如,以下结构使用LONG类型。
typedef struct tagBITMAPINFOHEADER {
...
LONG biWidth;
LONG biHeight;
...
} BITMAPINFOHEADER
答案 3 :(得分:1)
MinGW旨在构建Windows应用程序,以及int
和long
具有相同32位大小的Microsoft平台ABI specifies。如果MinGW定义long
与MSVC不同,那么使用long
的大多数现有Windows应用程序在使用MinGW进行编译时会中断。
话虽如此, Cygwin x86_64 确实遵循Windows上的LP64约定,就像在Linux上一样(source)。
因此,您可以使用它来构建long
大小为8字节的Windows应用程序:)
测试用例:
#include <stdio.h>
#include <windows.h>
int CALLBACK WinMain(HINSTANCE a, HINSTANCE b, LPSTR c, int d)
{
char buf[100];
snprintf(buf, sizeof(buf),
"sizeof(int)=%d, sizeof(long)=%d, sizeof(long long)=%d\n",
sizeof(int), sizeof(long), sizeof(long long));
MessageBox(NULL, buf, "Cygwin Test", MB_OK);
return 0;
}
编译:{{1}}
输出:
答案 4 :(得分:0)
这是特定于操作系统的。 Windows的大小仍然等于32位
答案 5 :(得分:0)
大多数Windows应用程序的编写期望为所有意图和目的int = long = 32位。我猜MinGW只是确保它仍然如此,并且没有任何意外。