我有一台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位寄存器?
提前感谢您的帮助。
答案 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