[英]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.