※2013/09/30 NSIntgerの情報が抜けていたので追記。
この様なプログラムで確認。
NSLog(@"sizeof(char)=%zu", sizeof(char)); NSLog(@"sizeof(BOOL)=%zu", sizeof(BOOL)); NSLog(@"sizeof(bool)=%zu", sizeof(bool)); NSLog(@"sizeof(short)=%zu", sizeof(short)); NSLog(@"sizeof(int)=%zu", sizeof(int)); NSLog(@"sizeof(long)=%zu", sizeof(long)); NSLog(@"sizeof(long long)=%zu", sizeof(long long)); int a = 10; NSLog(@"sizeof(&a)=%zu", sizeof(&a)); NSLog(@"sizeof(size_t)=%zu", sizeof(size_t)); NSLog(@"sizeof(NSInteger)=%zu", sizeof(NSInteger)); NSLog(@"sizeof(float)=%zu", sizeof(float)); NSLog(@"sizeof(double)=%zu", sizeof(double)); NSLog(@"sizeof(CGFloat)=%zu", sizeof(CGFloat));
【32bit環境】
※シミュレータの「iPhone Retina(4-inch)」で確認
型 | 返される値 |
---|---|
char | 1 |
BOOL | 1 |
bool | 1 |
short | 2 |
int | 4 |
long | 4 |
long long | 8 |
ポインタ | 4 |
size_t | 4 |
NSInteger | 4 |
float | 4 |
double | 8 |
CGFloat | 4 |
【64bit環境】
※シミュレータの「iPhone Retina(4-inch 64-bit)」で確認
型 | 返される値 |
---|---|
char | 1 |
BOOL | 1 |
bool | 1 |
short | 2 |
int | 4 |
long | 8 |
long long | 8 |
ポインタ | 8 |
size_t | 8 |
NSInteger | 8 |
float | 4 |
double | 8 |
CGFloat | 8 |
32bit環境と64bit環境とで異なる値が返されるものは以下の型。
型 | 32bit | 64bit |
---|---|---|
long | 4 | 8 |
ポインタ | 4 | 8 |
size_t | 4 | 8 |
NSInteger | 4 | 8 |
CGFloat | 4 | 8 |
float 型はどちらの環境でも4byteなのにも関わらず CGFloat は64bit環境では8byteなのは注意が必要ですね。後、意外なことに int は4byte(32bit)のままなんですね。CPUと同じbit数にする場合は int の代わりに NSInteger を使うと良さそうです。
ちなみに int のサイズがこの様になるのはAppleの64bit環境のデータモデルは LP64 だからです。 LP64 などデータモデルについてはこちらの記事が参考に成ります。
64ビットコンピューティング最前線:64ビットになると何が変わる?――64ビットプログラミングのデータモデル (2/2) - ITmedia エンタープライズ
http://www.itmedia.co.jp/enterprise/articles/0506/13/news006_2.html
関連情報
64-Bit Transition Guide for Cocoa Touch: Major 64-Bit Changes
https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/Major64-BitChanges/Major64-BitChanges.html#//apple_ref/doc/uid/TP40013501-CH2-SW1