私と同様の他の質問を読んで、ほとんどの人がインスタンスのサイズを知る必要がある理由を知りたがっていることがわかったので、問題の中心ではありませんが先に進みます。数千から数十万の非常に小さなオブジェクトを割り当てる必要があるプロジェクトに取り組んでいますが、オブジェクトのデフォルトの割り当てパターンではうまくいきません。オブジェクト プール クラスを作成することで、この問題を回避しました。これにより、膨大な量のオブジェクトを一度に割り当てて初期化することができます。割り当て解除も問題なく機能します (オブジェクトはプールに戻されます)。
それは実際には完全に機能し、私の問題ではありませんが、class_getInstanceSize
異常に大きなサイズが返されることに気付きました。たとえば、1 つsize_t
または 2 つの ( を含むisA
)Class
インスタンス変数を格納するクラスは、サイズが 40 ~ 52 バイトであると報告されています。class_getInstanceSize
複数回呼び出しても、連続して呼び出しても同じサイズが返される保証がないため、範囲を指定します。実際、すべてのオブジェクトが、本来あるNSObject
べきサイズからかけ離れたランダムなサイズを報告しているように見えます。
テストとして、私は試しました:
printf("Instance Size: %zu\n", class_getInstanceSize(objc_getClass("MyClassName"));
このコード行は、私が手動で正確に計算したサイズに対応する値を常に返します。たとえば、前の例では、12 バイト (32 ビット) と 24 バイト (64 ビット) になります。
ランタイムがバックグラウンドでより多くのメモリを必要とする何かを行っている可能性があると考えて、各オブジェクトの実際のメモリ使用量を観察しました。与えられた例では、読み書きされる唯一のメモリは、予想されるサイズであると計算した 12/24 バイト ブロック内にあります。
class_getInstanceSize
Apple と GNU 2.0 ランタイムの両方でこのように動作します。この動作を引き起こす既知のバグはありclass_getInstanceSize
ますか、それとも根本的に間違っているのでしょうか? 私のオブジェクト プールを非難する前に。従来のクラス メソッドと、カスタム クラス メソッドalloc
を使用してオブジェクトを割り当てることの両方を使用して、まったく新しいプロジェクトで同じテストを試みました。class_createInstance(self, 0);
前に言及するのを忘れていた 2 つのこと: 私はこれを自分のカスタム クラスでほぼ完全にテストしているので、クラスが実際にクラス クラスターであったり、そのナンセンスであったりすることにトリックがかかっているわけではないことがわかっています。2 番目に、両方とも単に を参照しているにもかかわらず、同じ結果を生成することはめったにclass_getInstanceSize([MyClassName class])
ありません。繰り返しますが、これは両方のランタイムで発生します。class_getInstanceSize(self) \\ Ran inside a class method
isA