1

私と同様の他の質問を読んで、ほとんどの人がインスタンスのサイズを知る必要がある理由を知りたがっていることがわかったので、問題の中心ではありませんが先に進みます。数千から数十万の非常に小さなオブジェクトを割り当てる必要があるプロジェクトに取り組んでいますが、オブジェクトのデフォルトの割り当てパターンではうまくいきません。オブジェクト プール クラスを作成することで、この問題を回避しました。これにより、膨大な量のオブジェクトを一度に割り当てて初期化することができます。割り当て解除も問題なく機能します (オブジェクトはプールに戻されます)。

それは実際には完全に機能し、私の問題ではありませんが、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_getInstanceSizeApple と GNU 2.0 ランタイムの両方でこのように動作します。この動作を引き起こす既知のバグはありclass_getInstanceSizeますか、それとも根本的に間違っているのでしょうか? 私のオブジェクト プールを非難する前に。従来のクラス メソッドと、カスタム クラス メソッドallocを使用してオブジェクトを割り当てることの両方を使用して、まったく新しいプロジェクトで同じテストを試みました。class_createInstance(self, 0);

前に言及するのを忘れていた 2 つのこと: 私はこれを自分のカスタム クラスでほぼ完全にテストしているので、クラスが実際にクラス クラスターであったり、そのナンセンスであったりすることにトリックがかかっているわけではないことがわかっています。2 番目に、両方とも単に を参照しているにもかかわらず、同じ結果を生成することはめったにclass_getInstanceSize([MyClassName class])ありません。繰り返しますが、これは両方のランタイムで発生します。class_getInstanceSize(self) \\ Ran inside a class methodisA

4

1 に答える 1

1

私は問題を解決したと思いますが、それはおそらくこれまでで最もばかげた理由によるものでした.

古いプロファイリング/デバッグ ライブラリを使用しています。実際、私はその実際の名前を知りません (ライブラリーは libcs​​uomm です。そのヘッダーには識別情報がありません)。それについて私が知っているのは、それが compsci ラボのコンピュータで利用できるライブラリだったということだけです (私は Comp-Sci を 1 年間履修した後、地質学専攻に切り替え、卒業し、振り返ることはありませんでした)。

とにかく、このライブラリのポイントは、多数のプロファイリングおよびデバッグ機能を提供することです。私が最もよく使用するのはメモリ リークの検出です。これは、C ベースで生の割り当て以外のオブジェクトを認識しない、他のお気に入りのメモリ リーク ライブラリ (現在サポートされていない MSS) とは異なり、オブジェクトごとに実際に追跡するためです。

私はデバッグ時によく使うので、何も考えずにデフォルトで設定しています。そのため、バグを特定するためにテスト プロジェクトを作成するときでさえ、何も考えずにセットアップしました。さて、ライブラリは実行時にいくつかのトリッキーを引き出すことで機能することが判明したため、オブジェクトを適切に追跡できます。無効にしたので、正しく機能しているように見えるので、それが問題の原因だったと思います。

今となっては、これがバグであるという結論に飛びつくのは気が引けますが、その時点では、自分のコードにその問題を引き起こす可能性のあるものは何も見当たりませんでした。

于 2012-12-24T10:24:06.713 に答える