2013-09-27 45 views
7

Làm cách nào để kiểm tra xem ứng dụng của tôi có được biên dịch trong 32 bit hay 64 bit không?Kiểm tra xem ứng dụng có được tích hợp trong 32 hoặc 64 bit không?

Điều này rất hữu ích để gỡ lỗi mã cấp thấp (làm việc với bộ đệm chẳng hạn).

+3

Tại sao bạn cần biết? Mã được viết đúng cách cũng hoạt động tốt. – dpassage

+0

Tôi đồng ý với @dpassage. Mặc dù nếu bạn cần biết hãy kiểm tra kiểu thiết bị. https://developer.apple.com/library/ios/documentation/uikit/reference/UIDevice_Class/Reference/UIDevice.html#//apple_ref/occ/instp/UIDevice/model – Desdenova

+0

@dpassage Nhận xét rất ngây thơ. Đúng cho những điều đơn giản, nhưng chắc chắn không, khi bạn muốn tối ưu hóa mã của bạn cho các kiến ​​trúc CPU khác nhau. –

Trả lời

2

Bạn có thể kiểm tra kích thước của con trỏ. Tôi nghĩ rằng trên 32bit nó là 4bytes và trên 64 nó phải được 8.

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

int vẫn còn 4 byte trong 64 bit. –

+0

ồ là buồn, người ta có thể thử sizeof (void) – rcpfuchs

+1

'sizeof (void *)' –

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

Thời gian biên dịch này. Câu hỏi đặt ra là cho thời gian chạy. –

18

Một kiểm tra thời gian biên dịch sẽ bao gồm #ifdef 'ing cho __LP64__, đó là tiêu chuẩn kích thước kiểu dữ liệu của ARM. Một giải pháp thời gian chạy sẽ bao gồm việc kiểm tra kích thước của con trỏ, như vậy:

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

Rất may, kích thước con trỏ là một điều mà các tiêu chuẩn khác nhau cho biên dịch mã 64-bit có vẻ đồng ý.

+5

Chỉ cần FYI, cả hai giải pháp '__LP64__' và' sizeof() 'đều là thời gian biên dịch. Đánh giá sizeof là một phần của quá trình biên dịch chứ không phải là một hàm. Trình biên dịch về cơ bản thay thế sizeof (loại) với kích thước của loại đó trên hệ thống bạn đang biên dịch. Lý tưởng nhất, #ifdef và if/else sẽ kết thúc biên dịch giống hệt nhau vì trình biên dịch sẽ thấy rằng 8 luôn luôn là == 8 và tối ưu hóa chi nhánh 8 == 4. – ultramiraculous

+0

Về mặt kỹ thuật, bạn chính xác (nhưng đối số của bạn được thiết lập dựa trên giả định của trình biên dịch tối ưu hóa). Có lẽ [this] (http://stackoverflow.com/a/7984249/945847) sẽ phù hợp với một định nghĩa nghiêm ngặt hơn về "kiểm tra thời gian chạy". – CodaFi

Các vấn đề liên quan