2010-12-15 9 views
2

私は現在、別のプラットフォームからいくつかのコードを移植しており、新しいプラットフォームのboolは1バイトサイズです。これは、値が32ビットの値として格納されるので、ローディングコードを破っています。さらに、私たちのプラットフォームでは速度が重要な問題であり、プロセッサは32ビットでネイティブに実行されるため、32ビットboolを使用したいと考えています。GCCの下で 'ブール'のサイズを強制する方法

gccに8ビットboolの代わりに32ビットboolsを使用させる方法はありますか?

+0

悲しいことに、私はAppleのGCCの-mone-byte-boolスイッチしか知りませんが、あなたが望むものとは逆のことをしています。 –

+0

私はあなたのローディングコードを修正することは問題ではないと思いますか? (実際には 'int'や' bool'のような組み込み型のサイズについては仮定しないでください) – jalf

+0

ローディングコードが既にサイズの違いを正しく処理していることが分かります。この問題は、列挙型が4バイトのサイズであると想定していたローディングコードの別の部分から発生しました。これは単純にそこに 'FORCE_DWORD'という値を設定することで解決しました。 –

答えて

1

int32_tを内部的に使用する独自のクラスを作成できますが、boolのように動作します。そのタイプを使用したいと思うフィールドの名前を変更する必要があることを意味します。これは、より多くの操作が可能になりますが、制御と分離が改善され、実際にはboolを他の場所で使用できます。私は個人的には、予想外のどこかにかかってしまうかもしれない#define hackeryを好みます。私はまた、32ビットのintが1バイトよりも速くて便利だと仮定することには注意したいと思います...パイプライニング、メモリ待ち時間、キャッシュサイズなどのその他の要因は、その差をわずかにしたり、32ビットにすることさえありませんintは、あなたのシステムでそれをベンチマークすることができます。あなたが保存/読み込みコードから自分の内部データ構造を分離する必要があります)

+0

これは実際に私がこれを投稿した直後に思いついたオプションです。理想的ではありませんでしたが、typedef /#よりも優れていました。コンパイラが認識できる型の違いが必要でした。 –

2
#define bool int 
+2

これはばかげて、あまりにも多くのものを壊すだろう。 – wilx

+5

@wilx、ブールのサイズがあまりにも多くの箇所で修正されると想定されるように読み込みコードが書かれていると、コードはすでに愚かで壊れています。 –

3

ブール値の大きさは、(5.3.3)実装定義である、とgccは、実行時にこれを設定するオプションを提供するために、表示されません。

あなたの実装定義コードが分離されていることを望みます。その場合は、代わりに4

(あるいは、狂気のためのはsizeof()== 1に対処するためint秒にごbool Sを変更したり、ロードコードを変更、4バイトとしてブール値を処理するためにはgccを変更タイプ:

編集:ポールトムブリンの#defineの使用の提案は、法的ではない可能性があります。[see here]でも、少なくともgcc 4.1.2で動作します。 [Link]しかし、あなたがすべての使用をヒットしなければ、boolはサイズの不一致がほとんどあなたを噛んでいます。

+0

リンクされた質問の答えを読んでいるのは、標準ヘッダーを含める前に '#define bool int'を実行することは違法ですが、後でそれを行うのは問題ありません。外部(標準)ライブラリのように、コンパイルしていないコードのboolの長さを変更することは期待できません。 –

+0

@Paul:それで、boolとintの両方のテンプレートに特化すれば、コンパイルエラーが発生します。 ( '' iostream'のようなものです。)実際の挑戦は、 'bool'がコードベースで広く普及していて、' s/bool/int/g'だけではできない場合、 'bool'を使用するあらゆる場所で' #define'本当の問題になる可能性があります。 – Bill

6

gcc/config/i386/i386.h#define BOOL_TYPE_SIZE 4を追加し、gccのを再コンパイルします。 boolをプラットフォームのネイティブboolタイプの内部データ構造に格納し、データの読み取り/書き込み時にストレージの1バイトのboolから適切な変換を実行するだけです。

関連する問題