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