在64位计算机中分配32位整数数组

时间:2012-04-05 05:25:47

标签: c++ memory-management

我有一台64位的i7机器。假设我为n个32位整数分配内存。在分配中实际使用了多少个物理寄存器:n或n / 2?

我尝试编写以下简单程序来查找。

#include <iostream>
#include <cstdlib>

using namespace std;

int main (int argc, char *argv[]) {
    int a[4];
    cout << &a[0] << "\t" << &a[3] << endl;
    cin.ignore (1);
    return 0;
} // End main ()

输出结果为:

0018FA04        0018FA10

他们似乎比他们应该更加分开。为什么不是地址04和07?这是否意味着系统实际上分配了四个(或更多)整数,而不是将四个32位整数打包成两个64位寄存器?

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:9)

每个int是32位(4字节)。其中3个产生12个字节。 0x0018FA10 - 0x0018FA04 = 12.

答案 1 :(得分:2)

这是布局:

a[0]; // 0018FA04 00 00 00 00
a[1]; // 0018FA08 00 00 00 00
a[2]; // 0018FA0C 00 00 00 00
a[3]; // 0018FA10 00 00 00 00

它与寄存器大小无关。

答案 2 :(得分:2)

  

我有一台64位的i7机器。假设我为n个32位整数分配内存。在分配中实际使用了多少个物理寄存器:n或n / 2?

64位i7机器是x86_64架构。

在这个架构上,32位整数数组将被完全打包,这意味着数组的大小将为4n字节。

如果通过物理寄存器表示机器字,并且您认为机器字在x86_64上是64位,那么它将使用n / 2个机器字。

我不会使用物理寄存器这个词,这可能与cpu寄存器混淆,cpu寄存器不是分配数组(除非非常小且优化器是积极的)。

  

他们似乎比他们应该更加分开。为什么不是地址04和07?这是否意味着系统实际上分配了四个(或更多)整数,而不是将四个32位整数打包成两个64位寄存器?

因为架构字节寻址而不是字寻址。它们按预期分开12 字节

答案 3 :(得分:1)

首先,使用sizeof(int)了解系统中 int 的宽度。然后sizeof(int) * N应该给出数组占用的char数。除非存在我称之为奇怪的系统(因为奇怪的对齐或数据填充,我认为已经对齐... 编辑虽然64位系统可能更喜欢将32位数据填充为额外的32位,这听起来几乎是合乎逻辑的)应该是提供的具体例子中的sizeof(int) * 4 == sizeof(a)。当然,数组 a 可能不会保存到任何CPU寄存器中,但它位于 main 函数的堆栈中。

修改

例如,

#include <iostream>
#include <cstdlib>

using namespace std;

int main (int argc, char *argv[]) {
    int a[4];
    cout << &a[0] << "\t" << &a[3] << endl;
    cout << sizeof(int) << " " << sizeof(a) << endl;
    cin.ignore (1);
    return 0;
} // End main ()
在使用Sun CC -m64编译的sparc机器上的

给出了

ffffffff7ffff748        ffffffff7ffff754
4 16