6
// <windef.h>

typedef int                 BOOL;

int は 32 ビットなので、これはメモリの無駄ではありませんか?

念のbool*ため、必要な関数に法線を送信しようとしましBOOL*たが、typedef int を使用するまで機能しませんでした。

4

5 に答える 5

19

うわー、そこで少し減速してください。まず第一に、intx86 でプログラミングが開始されて以来、プログラマーはブール変数に 4 バイトの s を使用してきたと確信しています。(以前はデータ型のようなものはありませんでしたbool)。そして、これと同じ typedef が Windows 3.1 にあると推測してみます<Windows.h>

次に、アーキテクチャについてもう少し理解する必要があります。32 ビット マシンを使用しているため、すべての CPU レジスタが 4 バイトまたは 32 ビット幅です。そのため、ほとんどのメモリ アクセスでは、1 バイト値よりも 4 バイト値を格納してアクセスする方が効率的です。

1 つの 4 バイトのメモリ チャンクに 4 つの 1 バイトのブール変数がパックされている場合、そのうちの 3 つは DWORD (4 バイト) で整列されていません。これは、CPU / メモリ コントローラが値を取得するために実際にはさらに多くの作業を行う必要があることを意味します。

そして、その「無駄な」typedefを作成するためにMSを壊す前に。これを考慮してください: 内部では、ほとんどのコンパイラ (おそらく)は、述べたのと同じ理由で、boolデータ型を 4 バイトとして実装しています。intgcc で試して、マップ ファイルを見てください。私は正しいに違いない。

于 2012-06-20T23:30:32.527 に答える
13

まず、システムAPIで使用されるタイプは、そのAPIが多数のプログラミング言語で使用されるため、可能な限り言語に依存しない必要があります。このため、一部の言語には存在しないか、他の言語では異なる方法で実装される可能性のある「概念的な」タイプは問題外です。たとえば、boolそのカテゴリに当てはまります。さらに、システムAPIでは、インターフェイスタイプの数を最小限に抑えることをお勧めします。で表すことができるものはすべて、で表すint必要がありますint

第二に、これが「記憶の浪費」であるというあなたの主張は、まったく意味がありません。「メモリの浪費」になるには、非常に多くのBOOL要素を含む集約データ型を構築する必要があります。Windows APIは、そのようなデータ型を使用しません。あなたがあなたのプログラムでそのような無駄なデータ型を構築したならば、それは実際にはあなたのせいです。一方、Windows APIは、ブール値を型に格納することを強制するものではありませんBOOL。その目的のためにバイト、さらにはビットを使用することができます。つまり、BOOLは純粋にインターフェイスタイプです。タイプのオブジェクトはBOOL、正しく使用している場合、通常、長期記憶をまったく占有しません。

于 2012-06-20T23:38:24.070 に答える
3

歴史的には、 0ではないもの=TRUEタイプBOOLとして使用されていました。たとえば、ダイアログプロシージャは、多くの情報を運ぶ可能性のあるを返しました。以下の署名は、Microsoft独自のドキュメントからのものです。BOOL

BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) 

シグニチャと関数の結果はいくつかの問題を混同したため、最新のAPIでは代わりに

INT_PTR CALLBACK DialogProc(
    _In_  HWND hwndDlg,
    _In_  UINT uMsg,
    _In_  WPARAM wParam,
    _In_  LPARAM lParam
);

この新しいfangled宣言は、古い宣言との互換性を維持する必要があります。つまりINT_PTRBOOL同じサイズである必要があります。つまり、32ビットプログラミングでBOOLは、32ビットです。

一般に、BOOL0と1だけでなく、任意の値にすることができるため、aとを比較することは非常に適切ではありませBOOLTRUE。そして、それを比較することはできますが、それは一般的に悪い習慣でもあります。なぜなら、それは人々に比較しても大丈夫FALSEだという印象を簡単に与えることができるからです。TRUEまた、それは全く不要だからです。

By the way, there are more boolean types in the Windows API, in particular VARIANT_BOOL which is 16 bits and where logical TRUE is represented as the all 1 bitpattern, i.e. -1 as a signed value…

That's an additional reason why it's not a good idea to compare directly with logical FALSE or TRUE.

于 2013-01-21T13:35:20.893 に答える
2

プロセッサは32ビットであり、ゼロ整数で動作する場合は特別なフラグが設定されているため、32ビットのブール値のテストが非常に高速になります。

1ビットまたは1バイトのブール値のテストは、何倍も遅くなります。

メモリスペースが心配な場合は、4バイトのブール変数が心配になるかもしれません。

ただし、ほとんどのプログラマーはパフォーマンスについてより心配しているため、デフォルトではより高速な32ビットブール値を使用します。

これが気になる場合は、コンパイラにメモリ使用量を最適化させることができる場合があります。

于 2012-06-20T23:35:25.747 に答える