現在、別のプラットフォームからいくつかのコードを移植していますが、新しいプラットフォームのboolは1バイトサイズです。値は32ビット値として格納されるため、これはロードコードを壊しています。さらに、速度はプラットフォームの重要な問題であり、プロセッサは32ビットでネイティブに実行され、32ビット以外のboolを比較するには追加の操作が必要になるため、32ビットのboolを使用したいと考えています。
gccに8ビットboolの代わりに32ビットboolを使用させる方法はありますか?
現在、別のプラットフォームからいくつかのコードを移植していますが、新しいプラットフォームのboolは1バイトサイズです。値は32ビット値として格納されるため、これはロードコードを壊しています。さらに、速度はプラットフォームの重要な問題であり、プロセッサは32ビットでネイティブに実行され、32ビット以外のboolを比較するには追加の操作が必要になるため、32ビットのboolを使用したいと考えています。
gccに8ビットboolの代わりに32ビットboolを使用させる方法はありますか?
gccに追加#define BOOL_TYPE_SIZE 4
して再コンパイルします;)gcc/config/i386/i386.h
boolのサイズは実装定義(5.3.3)であり、gccは実行時にこれを構成するオプションを提供していないようです。
うまくいけば、実装定義のコードは分離されています。その場合は、bool
sをint
sに変更するか、ロードコードを変更して、4ではなくsizeof()==1を処理します。
(または、クレイジーな場合は、gccを変更してboolを4バイト型として扱います。)
編集:Paul Tomblinの使用の提案は#define
合法ではないかもしれません[ここを参照]が、少なくともgcc4.1.2では機能します。[リンク]ただし、サイズの不一致をすべて使用しないbool
と、ほぼ確実に噛み付きます。
#define bool int
int32_t
内部で使用するが、のように動作する独自のクラスを作成できますbool
。これは、そのタイプを具体的に使用するフィールドの名前を変更する必要があることを意味します。これは、より多くの作業ですが、より優れた制御と分離を提供し、他の場所でも実際bool
のを使用できます。個人的には、予期しない場所で噛み付く可能性のある#defineハッカーよりもそれを好みます。また、32ビットint
が1バイトよりも便利に高速であると想定しないように注意します...パイプライン、メモリレイテンシ、キャッシュサイズなどの他の要因により、違いがわずかになるか、32ビットint
が遅くなる可能性があります。代表的なデータ処理を使用して、システムでベンチマークを行うことができます。
内部データ構造をストレージ/ロードコードから分離する必要があります。プラットフォームのネイティブbool
タイプの内部データ構造にboolを格納し、データの読み取り/書き込み時にストレージの1バイトboolとの間で適切な変換を行うだけです。