簡體   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