2012-05-09 26 views
7

BOOLのサイズが4バイト(つまり4の倍数)であるため、BOOL(typedef int)を使用するほうが標準のC++型boolよりも優れています。変数のレジスタやその行に沿ったものへの整列操作...C++ BOOL(typedef int)vs bool(パフォーマンス用)

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

私は決して整列、登録などの基本的な仕組みに関する専門家ではないので、これが完全に間違っていたら事前にお詫びします。私は訂正したいと思う。 :)

乾杯!

+6

'bool'が4バイトより速い場合、コンパイラは4バイトにします。シナリオによって異なります。そうではありません.BOOLはパフォーマンス上の利点はありません。 – tenfour

+0

これはプロファイリングでしか知ることのできないものですが、0,1以外の値を持つブールが欲しいですか?負の値ですか? – juanchopanza

+0

これで違いはありません。コンパイラは、値が正しく配置されるように値を埋めます。最も理にかなったタイプを使用してください。ブール値の場合は、 'int'(またはその' typedef')ではなく 'bool'にしてください。 –

答えて

7

まず、sizeof(bool)は、必ずしも1である必要はありません。これはimplementation-definedであり、コンパイラのライターはターゲットプラットフォームに適したサイズを自由に選択できます。

また、sizeof(int)は必ずしも4である必要はありません。

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

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

特定のコードにどのような違いがあるのか​​は、そのコードをプロファイリングすることによってのみ確定できます。あなたがC++で取得することができます

+0

そして、コンパイラはおそらく、これらの問題を反映するために 'bool'のサイズを適合させるでしょう。 –

+0

一般的に言えば;この例では、boolは1バイトであり、intは4バイトであるとしています。あなたはstruct {bool x; int y}; xはサイズが4の倍数ではないため、yがミスアライメントされる原因になりますか?または、yが整列するようにコンパイラがアドレスを埋めますか? –

+1

@KarlHansson:埋め込みは実装固有です。私がよく知っている実装では、 'x'の後ろに' y'が適切に配置されるようにパディングを挿入します。 – NPE

2

のみ保証サイズは常に1つのバイト、すべてのプラットフォーム用に定義されているcharunsigned char、および2)signed char、と。 0)1)


0)バイトが定義されたサイズを持っていませんが。 sizeof(char)は)常に1 byteですが、実際には40ビットのバイナリ

1かもしれませんはい、uint32_tや友人がそこにある、ない、彼らの定義は、実際のC++の実装のためのオプションです。それらを使用しますが、あなたが得ることが、彼らが利用できない場合

2)charunsigned char、およびsigned charは別個のタイプです(タイムエラーは常に良いですコンパイル)時のエラーをコンパイルし、charがあるかどうか定義されていないsignedかない。関数のオーバーロードとテンプレートの作成時にこのことを念頭に置いてください。

0

ブールに関して三一般的に受け入れられて、パフォーマンス主導型の習慣があります。

  1. は表現の問題をチェックし、もう1つはそれらについて注意する必要があるのif文ために。
  2. ブール式のチェックで多くの分岐予測が行われた場合は、(可能であれば)ハックを少し変わるものに置き換える必要があります。
  3. ブール値は最小データ型なので、ブール変数は構造体およびクラス内で最後に宣言する必要があります。そのため、パディングは構造体メモリレイアウトに顕著な穴を追加しません。

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

+0

#3は必ずしも真ではありません。構造体にギャップが既に存在するシナリオ(アラインメント/自動パディングのため)では、boolを配置することによって "空き"のギャップを "埋める"ことができます。この構造体はこれまでのところ、キャッシュラインのサイズの完璧な倍数であるサイズを持っていて、(ギャップを埋める代わりに)構造体の最後にboolを追加すると、試行したときに実際にキャッシュミスが発生するそのブールメンバーにアクセスすることができます(それ以外の場合はキャッシュミスはありません)。それぞれの構造体を個別に判断する必要があります。 –

+0

@PreetKukretiあなたが正しいと言えば、「基礎となるプラットフォームの知識を必要としない、一般に受け入れられている慣行」と言わねばならない。 SWが実行されるプラットフォームが分かっている場合は、アラインメント(4または8または...)を知って、それに応じて調整します。穴を埋める、キャッシュラインに合わせるなど。ブール値を扱う一般的なルールでした。 –