2013-09-27 137 views
7

如何檢查我的應用程序是以32位還是64位編譯的?檢查應用程序是建立在32位還是64位?

這對調試低級代碼很有幫助(例如使用緩衝區)。

+3

爲什麼你需要知道?正確編寫的代碼應該可以正常工作。 – dpassage

+0

我同意@dpassage。雖然如果你需要知道檢查設備型號。 https://developer.apple.com/library/ios/documentation/uikit/reference/UIDevice_Class/Reference/UIDevice.html#//apple_ref/occ/instp/UIDevice/model – Desdenova

+0

@dpassage非常天真的評論。對於簡單的事情是正確的,但絕對不是,當你想爲不同的CPU架構優化你的代碼時。 –

回答

2

您可以檢查指針的大小。我想在32位是4字節和64應該是8

if(sizeof(void*) == 4) then 32bit else 64bit 
+2

int在64位中保留4個字節。 –

+0

哦,那是可悲的,你可以試試sizeof(void) – rcpfuchs

+1

'sizeof(void *)' –

16
#ifdef __LP64__ 
    NSLog(@"64-bit\t"); 
#else 
    NSLog(@"32-bit\t"); 
#endif 
+3

這個編譯時間。問題在於運行時。 –

18

編譯時的檢查將涉及#ifdef「荷蘭國際集團的__LP64__,這是ARM的數據類型大小的標準。運行時的解決方案將包括檢查指針的大小,像這樣:

if (sizeof(void*) == 4) { 
    // Executing in a 32-bit environment 
} else if (sizeof(void*) == 8) { 
    // Executing in a 64-bit environment 
} 

值得慶幸的是,指針大小的一兩件事,編譯64位代碼,不同的標準似乎同意。

+5

僅供參考,'__LP64__'和'sizeof()'解決方案都是編譯時。評估sizeof是編譯過程的一部分,而不是函數。編譯器基本上將sizeof(type)替換爲要編譯的系統上該類型的大小。理想情況下,#ifdef和if/else最終會以相同方式編譯,因爲編譯器會看到8總是== 8並優化8 == 4分支。 – ultramiraculous

+0

從技術上講,你是正確的(但你的論點建立在優化編譯器的假設基礎上)。也許[this](http://stackoverflow.com/a/7984249/945847)將適合「運行時檢查」的更嚴格的定義。 – CodaFi

相關問題