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

Allocating 32-bit integer arrays in 64-bit machines

本文关键字:32位 整数 数组 分配 64位 计算机      更新时间:2023-10-16

我有一台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位寄存器中?

提前感谢您的帮助。

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

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

64位i7机器是x8_64体系结构。

在这个体系结构中,32位整数的数组将被完全打包分配,这意味着数组的大小将为4n字节。

如果您所说的物理寄存器是指机器字,并且您认为x86_64上的机器字是64位的,那么它将使用n/2个机器字。

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

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

因为体系结构是字节寻址而不是字寻址节

这是布局:

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

它与寄存器大小无关。

首先,使用sizeof(int)了解int在系统上的宽度。然后sizeof(int) * N应该给出数组所占用的字符数。除非存在我称之为奇怪的系统(因为奇怪的对齐或填充数据,我认为这些数据已经对齐…edit尽管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