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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-28 17:12:48  来源:igfitidea点击:

sizeof(long) in 64-bit C++

c++64-bit

提问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 longto 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 intand longhave the same size of 32 bits. If MinGW defined longdifferently from MSVC, most existing Windows apps that use longwould break when compiled using MinGW.

MinGW 旨在构建 Windows 应用程序,Microsoft 平台 ABI指定intlong具有相同的 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 longis 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:

输出:

Windows 64-bit LP64 using Cygwin

使用 Cygwin 的 Windows 64 位 LP64

回答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 只是确保情况仍然如此,并且没有任何意外。