objective-cで確保したメモリサイズを調べる

objective-cで確保するメモリサイズについてのメモ


sizeof演算子で変数型のサイズを表示できる。
以下はその例

// (c99ではzuでsize_t型を出力可能)
printf("sizeof(short int)  = %zu\n", (size_t)sizeof(short int));



sizeofの戻り値size_tは実装によってサイズが異なる。
size_tは__darwin_size_tのtypedefとして定義されている。
以下はMacOSX10.8.sdk/usr/include/sys/types.h内の定義

typedef __darwin_size_t		size_t;



__darwin_size_tは__SIZE_TYPE__が未定義の場合unsigned longとなっている。

#if defined(__GNUC__) && defined(__SIZE_TYPE__)
typedef __SIZE_TYPE__		__darwin_size_t;	/* sizeof() */
#else
typedef unsigned long		__darwin_size_t;	/* sizeof() */
#endif



size_tのサイズを表示するには以下の様にする。

        // sizeofの戻り値型のsize_t自体のサイズを表示
        size_t t;
        printf("sizeof(size_t)  = %zu\n", (size_t)sizeof(t));
        // 結果 sizeof(size_t)  = 8



Objective-cのオブジェクトはポインタのサイズを返すので注意
64bitなら8byteを返す。以下はその確認例

        NSString *myStr = @"test";
        printf("sizeof(NSString)  = %zu\n", (size_t)sizeof(myStr));
        // 結果 sizeof(NSString)  = 8



実行時に確保したメモリサイズを知るには、malloc_size関数を使う
実際のメモリより大きいサイズを返す場合があるとの事
注意:#import をインポートしておく必要がある。
参考:http://www.unix.com/man-page/OSX/3/malloc_size/
以下は例

        NSArray *array = @[@"test1",@"test2",@"test3"];
        NSLog(@"size of array: %zu", malloc_size((__bridge const void *)(array)));
        // 結果(略) size of array: 48

        //又は、<objc/objc-runtime.h>のインポートで以下も可能
        NSLog(@"size of myObj instanceSize: %zu", class_getInstanceSize([MyObj class]));



初期化時に各インスタンス変数が確保するメモリも知るには?
以下参考でallocを実行時に置換し、より正確なサイズを確認している。
iPhone開発でメモリ使用量を把握しよう! 1
iPhone開発でメモリ使用量を把握しよう! 2


要素100のint配列を生成する際にmallocとfreeではダメなのかという議論
http://stackoverflow.com/questions/1150650/is-it-ok-to-use-classic-malloc-free-in-objective-c-iphone-apps


もう少しちゃんと読みたい
Objective-C Runtime Reference


64bit環境でのmallocで確保するサイズの違い、
1024byteまでは16byteで、1024を超えると512byteで丸められる等の解説がある。
64-Bit Transition Guide for Cocoa