在C和C++中,有四种不同的数据类型可用于保存整数,即short,int,long和long long 。这些数据类型中的每一个都需要不同数量的内存。
但是有一个问题,与其他数据类型不同,“长”数据类型的大小不是固定的。它随体系结构,操作系统甚至我们使用的编译器而变化。在某些系统中,它的行为类似于int数据类型或long long数据类型,如下所示:
OS Architecture Size
Windows IA-32 4 bytes
Windows Intel® 64 or IA-64 4 bytes
Linux IA-32 4 bytes
Linux Intel® 64 or IA-64 8 bytes
Mac OS X IA-32 4 bytes
Mac OS X Intel® 64 or IA-64 8 bytes
好吧,它也因编译器而异。但是在此之前,让我们了解交叉编译器的概念。
交叉编译器是一种能够为除运行该编译器的平台以外的平台创建可执行代码的编译器。例如,如果我在运行64位Ubuntu的64位体系结构中编译以下程序,则将得到如下结果:
C++
// C++ program to check the size of 'long'
// data type
#include
using namespace std;
int main()
{
cout << "Size of int = "<< sizeof(int) << endl;
cout << "Size of long = " << sizeof(long) << endl;
cout << "Size of long long = " << sizeof(long long);
}
// This code is contributed by shubhamsingh10
C
// C program to check the size of 'long'
// data type
#include
int main()
{
printf("Size of int = %ld\n", sizeof(int));
printf("Size of long = %ld\n", sizeof(long));
printf("Size of long long = %ld", sizeof(long long));
}
Output in 32 bit gcc compiler:-
Size of int = 4
Size of long = 4
Size of long long = 8
Output in 64 bit gcc compiler:-
Size of int = 4
Size of long = 8
Size of long long = 8
请参阅本文,以了解有关如何使用32位或64位gcc编译器编译程序的更多信息。
从上面我们可以得出结论,只有“长”数据类型的大小因编译器而异。现在的问题是,这里到底发生了什么?让我们以编译器如何在内部分配内存的方式来讨论它。
CPU通过将位置的地址提供给MAR(内存地址寄存器)来从RAM调用数据。找到该位置并将数据传输到MDR(存储器数据寄存器)。此数据记录在处理器中的一个寄存器中,以进行进一步处理。因此,数据总线的大小决定了处理器中寄存器的大小。现在,一个32位寄存器一次只能调用4个字节大小的数据。而且,如果数据大小超过32位,则需要两个读取周期才能将数据放入其中。与64位相比,这会降低32位计算机的速度,后者只能在一个获取周期内完成操作。因此,显然,对于较小的数据,如果我的处理器的时钟速度相同,则没有任何区别。编译器旨在为目标机器体系结构生成最有效的代码。
因此,简而言之,变量的大小取决于编译器,因为它基于仅处理数据总线及其传输大小的目标体系结构和系统体系结构生成指令。
注意:有趣的是,我们不需要“ long”数据类型,因为C99标准已经提供了它们的替换(int,long long)。
Suggestion: If it is important to you for integer types to have the same size on all Intel platforms, then consider replacing “long” by either “int” or “long long”. The size of the “int” integer type is 4 bytes and the size of the “long long” integer type is 8 bytes for all the above combinations of operating system, architecture and compiler.
参考:
https://software.intel.com/zh-CN/articles/size-of-long-integer-type-on-different-architecture-and-os