2009-03-06 16 views
2

BOOLデータ型が事前に定義されていない場合は、次の定義でブール値を使用します。BOOL定義

typedef unsigned char BOOL;

(メモリ使用のために)。

パフォーマンス上の理由から、ネイティブバス幅を使用する方が良いかもしれないことに気付きました。たとえば、32ビットプロセッサの場合、

typedef unsigned int BOOL;

ここで、ネイティブバス幅にBOOLを定義したい場合、64ビットプロセッサはどうなりますか?

答えて

2

少なくともx86とARMは、ペナルティなしで32ビットレジスタとの間でバイトをロードして格納することができるため、charを使用するとパフォーマンスに影響はありません。私は完全にはわかりませんが、x86-64にもこのような指示があると確信しています。 (もちろん、x86とx86-64はレジスタで直接8ビット値を扱うこともできます)。

したがって、唯一の懸案事項はメモリレイアウトに関するものです。もちろん、コンパイラはすべてを整列させるので、ほとんどの場合、構造体のchar値はパディングされます。ただし、互いに隣り合っていなければ、実際には数バイトのスペースを節約して、わずかに優れたキャッシュパフォーマンスを得ることができます。膨大な配列のBOOLとメモリが問題になる場合は、とにかくパックしてください。

いずれにしても、それは問題ではありません。パフォーマンスやメモリの使用に重大な影響がある場合は、両方の方法でコンパイルされたプログラムを実行してみてください。そこにいるとわかったら、自分でビールを買って、それが私のものだとふりまえることができます。

+0

もしあなたがpack(1)しているのであれば、明らかに読み込み時に、boolを取り出す命令の数はネイティブの幅のワードをロードするだけではありません。この声明を視覚化できますか? – Alphaneo

+0

あなたは何を意味するのかはっきりしませんが、ARMはバイトをロードするためのldrb/strb命令を持っています。 X86は、レジスタの下位8ビット(eq。mov al、[addr])にバイトを直接ロードすることができ、eaxにゼロ拡張バイトをロードするmovzx eax、[addr]があります。 – TrayMan

+0

@TrayMan - 整列されていないデータのサイクルとバイト数をカウントして、その意味を調べます。重大なペナルティがあり、ムーフィーが言うように、存在する可能性がある場合は、そうすることができます。 – MarkusQ

13

効率的な幅(それはあなたの目標でした)のように、ネイティブバスの幅について心配しませんか?ほとんどどんなマシンでも、まともなcコンパイラはunsigned intを合理的に効率的な幅にコンパイルします。

+0

一つの例外である必要があります。その場合、16ビットが最小intサイズであるため、unsigned charがより効率的です。 –

+0

@monjardinはい、埋め込みについて話しているので重要かもしれません。しかし、誰も本当に8ビットバスで多くのことをやっていますか?その時点で私はあなたがカスタムASMや何かをやっていると思っていますが、それでも私は理由は分かりません。 – MarkusQ

+1

@ MarkusQ、あなたが推測するよりも8ビットバスを実行しているものがまだまだたくさんあります。例えば、8051のアーキテクチャは死ぬことはないようです。そして、Z80はあまりにも多くの人に暮らしています... – RBerteig

0

あなたはいつもtypedefをlong longなどに定義することができますが、実際に何らかの理由でこれが何かであるかどうかはわかりません。 (おそらく、sizeof(int *)やそのようなものに基づいて条件定義を行うこともできます)。

4
+0

私は票が切れているので、明日+1します。 size_tは、利用可能な最も広い符号なしタイプに自動的に展開されます。 –

3

私はプリプロセッサを使用することをお勧めします。あなたはstdbool.hでbool型を使用していないのはなぜ

#ifndef BOOL 
    #ifdef ILP32 
    #define BOOL uint32_t 
    #endif 
    #ifdef LP64 
    #define BOOL uint64_t 
    #endif 
#endif 
5

+0

C99を使用している場合のみ – TofuBeer

+0

利用可能な場合のみ。 – Alphaneo

0

charの使用は、整数を使用するよりも遅くなる可能性があります。

9

公演では決して投機しないでください。対策新しいバージョンのコンパイラバージョン、システムのアップグレード時に変更される可能性があることを覚えておいてください。

また、ある日あなたはブール値の配列を必要とするかもしれません。ブール缶の場合はでなく、が最適です。

+0

あなたのコードが翻訳するアセンブリ命令の数とそれぞれのクロックサイクルを調べてください。この場合、測定が少し難しくなると思います。 – Alphaneo

+0

私はあなたが何を得るのか理解していません。私は明確にしましょう:私は、そのような低レベル(すなわち、アルゴリズムではない)でパフォーマンスに疑問を抱くとき、比較が優れていることを意味しました。 boolを集中的に使用してベンチマークプログラムを作成し、charまたはboolで64ビットのboolと比較して測定します。 – philant

+0

メモリアラインメント、一度にどれだけのデータがフェッチされるかなど、さまざまな面白いことがあります。生の命令セット以外のことを知る必要がある場所。しかし、検証するためのテストは常に良いことです。 – TofuBeer

2

列挙 {= 0 FALSE、 TRUE = 1、 } BOOLのtypedef最もプラットフォーム

ために最適。 stdint.hから

+0

そのため、TRUE!=!FALSE – Mikeage

+0

??? あなたはどういう意味ですか? Iso c89は!0 == 1を必要とします。 –

0

int_fast8_tは、8ビット・マイクロコントローラ用の標準に準拠コンパイラに良い選択肢

関連する問題