4

200 の const 値を格納する必要があるとします。これには常に符号なしバイトを使用する必要がありますか?

これは私が推測する最小限のものです。しかし、構造体はどうですか?32 ビット システムで 32 で割り切れるように構造体を構築するのは賢明ですか? 構造体の非常に大きな配列を反復処理する必要があるとしましょう。構造体が 34 ビットで構成されているか 64 ビットで構成されているかは重要ですか? 34ビットの構造体から2ビットを絞り出すことができれば、多くの利益が得られると思いますか?

または、これらすべてが不必要なオーバーヘッドを引き起こしますか?この構造体内のすべてのビットとショートをintに置き換えて、CPUが適切なメモリブロックを「探しに行く」必要がないようにする方がよいでしょうか?

4

2 に答える 2

8

これは強力なプロセッサ実装の詳細です。CLR とジッタは、プログラムから最高のパフォーマンスを得るためにデータ型が最適であることを確認するために、すでに多くの作業を行っています。たとえば、構造体が 34 ビットを占有するケースは決してありません。CLR 設計の選択により、最新のプロセッサで適切に機能する型の使用を開始できるようになっています。

構造体は最適になるようにレイアウトされており、データ型に応じた配置の選択が含まれます。たとえば、 int は常に 4 の倍数であるオフセットにアラインされます。これにより、プロセッサは int を簡単に読み取ることできます。ミスアラインされたバイトを int に多重化して戻す必要はなく、値がCPU キャッシュ ラインにまたがっており、複数のメモリ バス読み取りから一緒に接着する必要があります。一部のプロセッサ イベントは、読み取りと書き込みのミスアライメントを致命的なエラーとして扱います。これは、マシンに Itanium がない理由の 1 つです。

したがって、byte と int を持つ構造体がある場合、byte と int の間の 3 バイトを使用しない 8 バイトのデータ型になります。これらの未使用のバイトは、パディングと呼ばれます。また、構造体を配列に配置するときにアライメントが最適になるように、構造体の最後にパディングを入れることもできます。

1 つの変数をバイトとして宣言しても問題ありません。Intel/AMD プロセッサは、1 つの変数を 32 ビット int として読み書きするのに同じ時間を要します。ただし、短い使用は問題ありません。これには、cpu 命令 (サイズ オーバーライド プレフィックス) に余分なバイトが必要であり、余分な cpu サイクルがかかる可能性があります。実際には、整列規則のためにメモリを節約することはあまりありません。バイトを使用すると、別のバイトと組み合わせることができる場合にのみ何かが得られます。バイトの配列は問題ありません。複数のバイト メンバを持つ構造体も問題ありません。あなたの例はそうではありません。 intを宣言すると同様に機能します。

int より小さい型を使用すると、C# コードでは扱いにくい場合があります。MSIL コード モデルは int ベースです。+ や - などの基本的な演算子は、int 以上の型に対してのみ定義されており、小さい型の演算子はありません。そのため、キャストを使用して結果を切り捨てて小さなサイズに戻す必要があります。スイート スポットはintです。

于 2013-10-05T16:36:53.170 に答える
1

うわー、それは本当にたくさんのものに依存します。パフォーマンスやメモリが気になりますか? パフォーマンスの場合は、通常、「自然な」ワード サイズの配置を維持する方が適切です。したがって、たとえば、64 ビット整数を使用する 64 ビット プロセッサを使用している場合、64 ビット境界に揃えると最高のパフォーマンスが得られます。C# がこの種のことについて保証しているとは思いません (ハードウェアから抽象化することを意図しています)。

とはいえ、「時期尚早の最適化の罪を回避する」という非公式のルールがあります。これは特に C# に当てはまります。パフォーマンスやメモリに問題がない場合は、心配する必要はありません。

パフォーマンスの問題があることがわかった場合は、プロファイラーを使用して、問題が実際にどこにあるかを判断します (考えている場所ではない可能性があります)。メモリの問題である場合は、最も多くのメモリを消費しているオブジェクトを特定し、最適化できる場所を特定します (可能であれば、int または short ではなくバイトを使用する例に従って)。

そのような詳細について本当に心配する必要がある場合は、C++ の使用を検討することをお勧めします。C++ では、メモリの使用をより適切に制御できます (たとえば、メモリの大きなブロックを初期化せずに割り当てることができます)、ビットフィールドなどにアクセスできます。

于 2013-10-05T16:50:18.713 に答える