強火で進め このページをアンテナに追加 RSSフィード

整理された情報は こちら へどうぞ。

2013年09月29日

[]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)」で確認

返される値
char1
BOOL1
bool1
short2
int4
long4
long long8
ポインタ4
size_t4
NSInteger4
float4
double8
CGFloat4

【64bit環境】

※シミュレータの「iPhone Retina(4-inch 64-bit)」で確認

返される値
char1
BOOL1
bool1
short2
int4
long8
long long8
ポインタ8
size_t8
NSInteger8
float4
double8
CGFloat8

32bit環境と64bit環境とで異なる値が返されるものは以下の型。

32bit64bit
long48
ポインタ48
size_t48
NSInteger48
CGFloat48

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

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

リンク元