7

BOOL のサイズは 4 バイト (つまり 4 の倍数) であり、変数のアラインメント操作をレジスタまたはそれらの行に沿って何かに保存するため、BOOL (typedef int) を使用する方が標準の c++ 型 bool を使用するよりも優れていることをどこかで読みました.. .

これに真実はありますか?bool (1 バイト) を使用しても、4 の倍数のアラインメントを維持するために、コンパイラがスタック フレームをパディングすると思いますか?

私はアライメントやレジスタなどの基礎となる仕組みの専門家ではないので、これが完全に間違っている場合は事前にお詫び申し上げます。修正されることを願っています。:)

乾杯!

4

3 に答える 3

8

まず第一に、必ずしもでsizeof(bool)はありません1。これは実装定義であり、プログラマーの作成者がターゲットプラットフォームに適したサイズを自由に選択できるようにします。

また、sizeof(int)必ずしもそうではありません4

パフォーマンスに影響を与える可能性のある複数の問題があります。

  • アラインメント;
  • メモリ帯域幅;
  • マシンワードよりも狭い値を効率的にロードするCPUの機能。

特定のコードに生じる違いは、そのコードをプロファイリングすることによってのみ確立できます。

于 2012-05-09T08:05:25.273 に答える
2

C++ で取得できる唯一の保証されたサイズは、charunsigned char、およびsigned char 2)であり、これらは常に正確に 1 バイトであり、すべてのプラットフォームに対して定義されています。0) 1)


0) ただし、バイトには定義されたサイズはありません。sizeof(char)は常に1 byteですが、実際には 40 バイナリ ビットである可能性があります

1) はい、uint32_tと 仲間がいますが、いいえ、それらの定義は実際の C++ 実装ではオプションです。それらを使用しますが、それらが利用できない場合はコンパイル時エラーが発生する可能性があります (コンパイル時エラーは常に良好です)。

2) charunsigned char、およびsigned charは異なる型であり、かどうかcharは定義されてsignedいません。関数をオーバーロードし、テンプレートを作成するときは、このことに注意してください。

于 2012-05-09T11:42:09.510 に答える
0

ブール値に関して、一般的に受け入れられているパフォーマンス主導のプラクティスが 3 つあります。

  1. if ステートメントでは、式をチェックする順序が重要であり、注意が必要です。
  2. ブール式のチェックによって多くの分岐予測ミスが発生する場合は、(可能であれば) 少しいじるハックに置き換える必要があります。
  3. boolean は最小のデータ型であるため、boolean 変数は構造体とクラスで最後に宣言する必要があります。これにより、パディングによって構造体のメモリ レイアウトに目立った穴が追加されません。

ただし、ブール値を(符号なし?)整数で置き換えることによるパフォーマンスの向上については聞いたことがありません。

于 2012-05-11T10:21:50.540 に答える