64 位 C++ 中的 sizeof(long)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7607502/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
sizeof(long) in 64-bit C++
提问by TonyK
I have downloaded MinGW-64, so I can now compile 64-bit programs for Windows 7, using g++ 4.7.0 (experimental). But the following line:
我已经下载了 MinGW-64,所以我现在可以使用 g++ 4.7.0(实验性)为 Windows 7 编译 64 位程序。但以下行:
cout << sizeof(long) << " " << sizeof(void*) << endl ;
prints 4 8
, not 8 8
. The documentation for g++ 4.6.0 says:
打印4 8
,不是8 8
。g++ 4.6.0 的文档说:
The 64-bit environment sets int to 32 bits and long and pointer to 64 bits
64 位环境将 int 设置为 32 位,将 long 和指针设置为 64 位
Does anybody know why sizeof(long)
is not 8?
有人知道为什么sizeof(long)
不是8吗?
Edited to add:The source of my confusion was that g++ 4.7.0 for 64-bit Windows is not (yet) an official part of the GNU Compiler Collection. And it's the first 64-bit version with a 32-bit long
, so the documentation simply doesn't apply to it. Indeed, if you go to the relevant web page, the full entry for IA-32/x86-64consists of this:
编辑添加:我困惑的根源是用于 64 位 Windows 的 g++ 4.7.0(还)不是 GNU 编译器集合的官方部分。而且它是第一个带有 32 位的 64 位版本long
,因此文档根本不适用于它。事实上,如果您访问相关网页,IA-32/x86-64的完整条目包括:
...
...
回答by jalf
Because it doesn't have to be. The C++ standard only requires that it is (if memory serves) at least 32 bits wide, and at least as big as int
.
因为它不必如此。C++ 标准只要求它(如果有内存的话)至少 32 位宽,至少和int
.
MSVC (and the ABI used by Windows) defines long
to be 32 bits wide, and MingW follows suit because well, the compiler is a lot more useful when it agrees with the host OS
MSVC(以及 Windows 使用的 ABI)定义long
为 32 位宽,MingW 紧随其后,因为编译器在与主机操作系统一致时更有用
回答by Roel Van Nyen
On the microsoft windows OS you have LLP64 so the size of long is 32 bit. (see the table below)
在 microsoft windows 操作系统上,你有 LLP64,所以 long 的大小是 32 位。(见下表)
Quote from wikipedia:
引自维基百科:
In 32-bit programs, pointers and data types such as integers generally have the same length; this is not necessarily true on 64-bit machines. Mixing data types in programming languages such as C and its descendants such as C++ and Objective-C may thus function on 32-bit implementations but not on 64-bit implementations. In many programming environments for C and C-derived languages on 64-bit machines, "int" variables are still 32 bits wide, but long integers and pointers are 64 bits wide. These are described as having an LP64 data model. Another alternative is the ILP64 data model in which all three data types are 64 bits wide, and even SILP64 where "short" integers are also 64 bits wide. However, in most cases the modifications required are relatively minor and straightforward, and many well-written programs can simply be recompiled for the new environment without changes. Another alternative is the LLP64 model, which maintains compatibility with 32-bit code by leaving both int and long as 32-bit. "LL" refers to the "long long integer" type, which is at least 64 bits on all platforms, including 32-bit environments.
在 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
回答by relent95
MinGW is designed to build a WIN32 application and WIN32 headers/libraries assumes the long(or LONG) type to be 32 bits wide even on a 64bit Windows. Microsoft decided that otherwise so much of the existing Windows source codes should be changed. For example, the following structure uses LONG types.
MinGW 旨在构建 WIN32 应用程序,WIN32 标头/库假设 long(或 LONG)类型为 32 位宽,即使在 64 位 Windows 上也是如此。微软决定,否则应该更改大量现有的 Windows 源代码。例如,以下结构使用 LONG 类型。
typedef struct tagBITMAPINFOHEADER {
...
LONG biWidth;
LONG biHeight;
...
} BITMAPINFOHEADER
;
;
回答by rustyx
MinGW is designed to build Windows applications, and the Microsoft platform ABI specifiesthat int
and long
have the same size of 32 bits. If MinGW defined long
differently from MSVC, most existing Windows apps that use long
would break when compiled using MinGW.
MinGW 旨在构建 Windows 应用程序,Microsoft 平台 ABI指定它int
并long
具有相同的 32 位大小。如果 MinGW 的定义long
与 MSVC 不同,那么大多数现有的 Windows 应用程序long
在使用 MinGW 编译时都会中断。
Having said that, Cygwin x86_64does follow the LP64 convention on Windows, just like on Linux (source).
话虽如此,Cygwin x86_64确实遵循 Windows 上的 LP64 约定,就像在 Linux 上一样(源代码)。
So you can use that to build a Windows app where the size of long
is 8 bytes :)
因此,您可以使用它来构建大小long
为 8 个字节的 Windows 应用程序:)
Test case:
测试用例:
#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;
}
Compile with: C:\cygwin64\bin\gcc.exe -mwindows -m64 cygwin-test.c -o cygwin-test
编译: C:\cygwin64\bin\gcc.exe -mwindows -m64 cygwin-test.c -o cygwin-test
Output:
输出:
回答by Andrey Atapin
It's OS specific. Windows still has size of long equal 32 bits
这是特定于操作系统的。Windows 仍然具有 long 等于 32 位的大小
回答by Alexey Frunze
Most of Windows applications are written with the expectation that for all intents and purposes int=long=32 bits. I'm guessing MinGW is just making sure it's still the case and there're no surprises.
大多数 Windows 应用程序的编写都期望对于所有意图和目的 int=long=32 位。我猜 MinGW 只是确保情况仍然如此,并且没有任何意外。