2009-11-24 88 views
1

所以我看了很多相關的帖子在SO和其他地方,如:爲什麼我在32位Mac OS X系統上看到C++中的64位指針?

Is the sizeof(some pointer) always equal to four?

這非常有意義,我認爲在32位系統上我希望4個字節的指針和上一個64位系統我期望8字節指針。所以我運行此代碼:

int main() 
{ 
    cout << "sizeof(int) = " << sizeof(int) << endl; 
    cout << "sizeof(void*) = " << sizeof(void*) << endl; 
} 

這是對應的輸出:

sizeof(int) = 4 
sizeof(void*) = 8 

我在Mac OS X 10.6.1 32位模式下運行。下面是「UNAME -A」的輸出:

Darwin brent-nashs-macbook.local 10.0.0 Darwin Kernel Version 10.0.0: Fri Jul 31 22:47:34 PDT 2009; root:xnu-1456.1.25~1/RELEASE_I386 i386 i386 

這裏的G的版本++我運行(默認是系統附帶):

i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646) 

所以我意識到,指針的大小不能保證從系統到系統,它們完全依賴於編譯器和體系結構,但是這樣的結果是否會導致其他人不合邏輯?這僅僅是Mac OS X 10.6的特性或我的設置?還是有一個很好的理由我看到了這種尺寸的指針?

============================================== ====

後回答加成

額外的細節,誰想要他們...

我最初使用此命令行編譯:

g++ -Wall -o TestClass1 TestClass1.cpp 

而且它產生的這種輸出:

sizeof(int) = 4 
sizeof(void*) = 8 

下面的建議後,我在我的命令行改成這樣:

g++ -Wall -o TestClass1 -arch i386 TestClass1.cpp 

和輸出更改爲:

sizeof(int) = 4 
sizeof(void*) = 4 

回答

7

您運行的是32位內核,但你將代碼編譯成64位可執行文件。無論使用哪個內核,32位和64位代碼都可以在OS X中運行。

如果要將代碼編譯爲32位可執行文件,請將-arch i386標誌傳遞給gcc。 64位的相應標誌是-arch x86_64,但它是Snow Leopard的默認值。

+0

完全有意義。沒有意識到雪豹是默認爲64位彙編。感謝您的快速反饋!也許這是我的提示,不要寫這麼多的Java ...;) –

+0

此外,你可以使用lipo來獲取有關二進制的信息,或從胖二進制文件中去除不需要的版本。 –

+0

樂於幫助。請注意,OS X和Linux對64位代碼使用「LP64」模型,這意味着64位寬(在64位Windows系統上,長32位) - 這通常會讓來自Windows背景。 –

相關問題