// <windef.h>
typedef int BOOL;
int は 32 ビットなので、これはメモリの無駄ではありませんか?
念のbool*
ため、必要な関数に法線を送信しようとしましBOOL*
たが、typedef int を使用するまで機能しませんでした。
うわー、そこで少し減速してください。まず第一に、int
x86 でプログラミングが開始されて以来、プログラマーはブール変数に 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 バイトとして実装しています。int
gcc で試して、マップ ファイルを見てください。私は正しいに違いない。
まず、システムAPIで使用されるタイプは、そのAPIが多数のプログラミング言語で使用されるため、可能な限り言語に依存しない必要があります。このため、一部の言語には存在しないか、他の言語では異なる方法で実装される可能性のある「概念的な」タイプは問題外です。たとえば、bool
そのカテゴリに当てはまります。さらに、システムAPIでは、インターフェイスタイプの数を最小限に抑えることをお勧めします。で表すことができるものはすべて、で表すint
必要がありますint
。
第二に、これが「記憶の浪費」であるというあなたの主張は、まったく意味がありません。「メモリの浪費」になるには、非常に多くのBOOL
要素を含む集約データ型を構築する必要があります。Windows APIは、そのようなデータ型を使用しません。あなたがあなたのプログラムでそのような無駄なデータ型を構築したならば、それは実際にはあなたのせいです。一方、Windows APIは、ブール値を型に格納することを強制するものではありませんBOOL
。その目的のためにバイト、さらにはビットを使用することができます。つまり、BOOL
は純粋にインターフェイスタイプです。タイプのオブジェクトはBOOL
、正しく使用している場合、通常、長期記憶をまったく占有しません。
歴史的には、 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_PTR
、BOOL
同じサイズである必要があります。つまり、32ビットプログラミングでBOOL
は、32ビットです。
一般に、BOOL
0と1だけでなく、任意の値にすることができるため、aとを比較することは非常に適切ではありませBOOL
んTRUE
。そして、それを比較することはできますが、それは一般的に悪い習慣でもあります。なぜなら、それは人々に比較しても大丈夫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.
プロセッサは32ビットであり、ゼロ整数で動作する場合は特別なフラグが設定されているため、32ビットのブール値のテストが非常に高速になります。
1ビットまたは1バイトのブール値のテストは、何倍も遅くなります。
メモリスペースが心配な場合は、4バイトのブール変数が心配になるかもしれません。
ただし、ほとんどのプログラマーはパフォーマンスについてより心配しているため、デフォルトではより高速な32ビットブール値を使用します。
これが気になる場合は、コンパイラにメモリ使用量を最適化させることができる場合があります。