35

Objective-C オブジェクトのサイズを見つけようとしています。私は次のようなものを使用しています:

    NSLog(@"sizeof myObject: %ld", sizeof(*myObject));

しかし、それは私にポインタのサイズを与えるだけです。

私は何を間違っていますか?

4

6 に答える 6

55

コンパイラーが知っているのはポインターだけです。そのため、ポインターのサイズが返されます。割り当てられたオブジェクトのサイズを確認するには、次のコードスニペットのいずれかを使用します。

ARCの場合:

#import <malloc/malloc.h>

// ...

NSLog(@"Size of %@: %zd", NSStringFromClass([myObject class]), malloc_size((__bridge const void *) myObject));

ARCなし:

#import <malloc/malloc.h>

// ...

NSLog(@"size of myObject: %zd", malloc_size(myObject));

Mike Ashは、彼のQ&AブログでObj-Cランタイム内部のいくつかについてまともな記事を書いています:http://mikeash.com/? page = pyblog / friday-qa-2009-03-13-intro-to-the -objective-c-runtime.html

于 2009-04-17T20:17:56.803 に答える
19

GNU Objective-C ランタイムでは、以下を使用できます (以下をインポートする必要があります<objc/objc-api.h>

class_get_instance_size ([MyClass class]);

Mac OS X では、以下を使用できます (インポートする必要がある場合があります<objc/runtime.h>)。

class_getInstanceSize ([MyClass class]);

これらの関数は、オブジェクトを割り当てるために必要なメモリの量を返します。初期化時にオブジェクトによって割り当てられたメモリは含まれません。

于 2009-04-18T05:45:29.060 に答える
15

まず第一に、上記の投稿から、Jason および Mac OS リファレンス マニュアルで提案されているように、オブジェクトサイズが malloc_size(myObject) によって与えられることは明らかだと思います。

「malloc_size( ptr ) 関数は、 ptr が指す割り当てをサポートするメモリ ブロックのサイズを返します メモリ ブロックのサイズは常に、少なくともそれがサポートする割り当てと同じ大きさであり、それよりも大きい場合があります。」( http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/malloc_size.3.html )

ただし、辞書のサイズを知りたい場合は、次の点に注意してください。

ディクショナリはキーと値のペアを格納し、値の部分にオブジェクト自体は含まれませが、「追加」されるオブジェクトの保持カウントを増やすだけで、そのオブジェクトとそれ自体の参照を保持します。現在、ディクショナリ自体には、さまざまなオブジェクトへの参照が含まれているだけです (キーが添付されています)。したがって、ディクショナリによって参照されるすべてのオブジェクトのオブジェクト サイズを探している場合、技術的にはディクショナリのサイズではありません。ディクショナリのサイズは、すべてのキーのサイズと、キーに対するすべての値参照のサイズと、親の NSObject のサイズの合計になります。参照されているオブジェクトのサイズも知りたい場合は、ディクショナリ値配列を反復処理してみてください。

NSArray *myArray = [myDictionary allValues];
id obj = nil;
int totalSize = 0;
for(obj in myArray)
{
    totalSize += malloc_size(obj);
}
//totalSize now contains the total object size of the refered objects in the dictionary.

それが質問に答えることを願っています。

于 2010-09-16T20:00:48.457 に答える
7

(objective-c) オブジェクトのサイズは、定義するのも簡単ではないため、見つけるのも簡単ではありません。「objective-c オブジェクトのサイズ」とはどういう意味ですか?

参照のサイズは、ポインターのサイズです (sizeof(obj_ref) によって返されます)。

作成時に割り当てられたメモリのサイズ (+alloc) は、Jason が最初の回答で示した方法で見つけることができます。ただし、これはランタイムに依存します。gnu-runtime は、apple-runtime とは異なります。最終的に、これは、インスタンスを構成するプリミティブ データ型に必要なメモリのみになります。ただし、後で (つまり、初期化 (-init) 中に) ivar または文字列によって参照されるオブジェクトに割り当てられる可能性があるメモリではありません。

クラスのインスタンス

@interface FirstClass
{
    int _someInt;
    char _someChar;
}
…
@end

少なくとも 5 バイト (多くのシステムでintはサイズが異なる場合があります) に加えて、ランタイムで必要な場合は静的オーバーヘッドが必要です。そのようなオブジェクトのサイズは明らかです。

しかし、クラスのインスタンスの場合

@interface SecondClass
{
    FirstClass *_someObject;
    char *_name;
    id _data;
}
…
@end

「サイズ」の定義は複雑です。オブジェクトには、12 バイト (32 ビット システムの場合) と、割り当てのオーバーヘッドが必要です。しかし、おそらく名前はオブジェクトの一部であり、それによって割り当て/解放されます。実際の名前が必要とするメモリは、オブジェクトのサイズの一部であるべきですか? 参照されたオブジェクトについてはどうでしょうか。

于 2009-04-17T21:58:01.680 に答える
5

class_getInstanceSizeを使用しmalloc_good_sizeて、それが何に切り上げられるかを確認することをお勧めします。これは、返されたサイズ内のivarsなどを表示しません。

#import <malloc/malloc.h>
#import <objc/runtime.h>

NSLog(@"Object Size: %zd", malloc_good_size(class_getInstanceSize([yourObject class])));
于 2013-01-28T18:00:21.330 に答える
-2

クラスの説明にはサイズ情報が含まれていると思いますsizeof。演算子を使用してクエリを実行するよりも、これを検索する方が適切です。

于 2009-04-17T20:17:43.373 に答える