繁体   English   中英

在64位机器分配32位 integer arrays

[英]Allocating 32-bit integer arrays in 64-bit machines

我有一台 64 位 i7 机器。 假设我为 n 个 32 位整数分配了 memory。 分配中实际使用多少个物理寄存器: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 ()

output 是:

0018FA04        0018FA10

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

在此先感谢您的帮助。

每个 int 都是 32 位(4 字节)。 其中 3 个构成 12 个字节。 0x0018FA10 - 0x0018FA04 = 12。

这是布局:

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

它与寄存器大小无关。

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

64 位 i7 机器是 x86_64 架构。

在这个架构上,一个 32 位整数数组将被分配为完全压缩,这意味着该数组的大小将为 4n 字节。

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

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

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

因为该体系结构是字节寻址的而不是字寻址的 正如预期的那样,它们相隔 12个字节

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

编辑

例如,

#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 ()

在 sparc 机器上,用 Sun CC -m64 编译,给出

ffffffff7ffff748        ffffffff7ffff754
4 16

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM