強火で進め

このブログではプログラム関連の記事を中心に書いてます。

iOSのこれまでの32bit環境と新しい64bit(arm64)環境、それぞれで sizeof() から返されるデータ一覧

※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