2011-08-25 157 views
6

我在64位linux下使用C++,編譯器(g ++)也是64位。當我打印一些變量的地址,例如一個整數時,它應該打印一個64位整數,但實際上它會打印一個48位整數。64位機器上的C++指針

int i; 
cout << &i << endl; 

output: 0x7fff44a09a7c 

我想知道另外兩個字節在哪裏。期待你的幫助。

謝謝。

+0

多少位沒有'數1'有哪些?你會抱怨'uint32_t x = 1;'沒有足夠的位?你應該檢查'sizeof(* int)'而不是打印東西。 –

回答

7

在大多數C++實現中打印地址會抑制前導零以提高可讀性。像0x00000000000013fd這樣的東西並沒有真正增加價值。

當你想知道爲什麼在用戶空間中通常看不到超過48位的值時,這是因爲當前的AMD64體系結構被定義爲具有48位的虛擬地址空間(如在Linux上可以看到cat /proc/cpuinfo

+0

這個維基百科(是的,我知道)文章說架構定義允許多達64位,但目前的實現只使用48.它是錯誤的嗎? http://en.wikipedia.org/wiki/Amd64#Architectural_features – AndrzejJ

+0

@AndrzejJ這是一個「64位」架構,名義上指針是64位。只是當前256TB的虛擬地址空間已經綽綽有餘,並且如果您可以假設每個指針的高16位都爲零,則可以節省電線(並因此節省電源)。 – Voo

3

他們在那裏 - 他們沒有去過任何地方 - 這只是流中的格式。它跳過前導零(檢查流的填充和寬度屬性)。

編輯:關於第二個想法,我不認爲有一個很好的方式來更改指針默認operator<<的格式。如果使用std::hex操縱器進行流式處理,則可以更改填充和寬度屬性。

+0

所以如果某個對象的地址是0x400c10,那就意味着5個字節的前導零被省略了,對吧? – cheng

+1

@ user508305它可能,但請注意,所有指針不一定與平臺尋址功能的大小相同。 –

+0

在什麼情況下他們有不同的大小?你能談談更多關於這個,或者只是給我一些關鍵詞,以便我可以谷歌它。 – cheng

1

爲了好玩,你可以使用C的輸出,看看它更像是你後:

printf("0x%p");