0

これが問題かどうかはわかりませんが、確かに好奇心です。32 ビット整数とブール値 (stdbool.h) を取る関数をエクスポートする C DLL があります。エクスポートされた関数 (stdcall) は、パラメーター リストが 8 バイト (4 バイト int、4 バイト bool) であることを示します。この C DLL には、ブール値を使用する構造体も含まれています。チェックsizeof(bool)は 1 バイトのブール値を示します。

このネイティブ DLL の .Net ラッパーがあります。構造体をマーシャリングするとき、ブール値フィールド UnmanagedType.U1 ごとに指定しましたが、すべて正常に機能し、すべてが正しく配置されています。私はシーケンシャルレイアウトのみを使用し、明示的でも、オフセットも、パッキングも使用しませんでした。

私の質問は、ブール値のサイズに明らかな不一致があるのはなぜですか?

4

1 に答える 1

0

「int」より小さい C のすべての関数パラメーターは、呼び出しで「int」サイズに変換されます。これは、各パラメーターが (ほとんどのアーキテクチャーで) 個別にスタックに配置されるため、通常は「int」のサイズに等しいスタック セル サイズに変換されるためです。

構造については、何も変換されません。ただし、構造のアライメントを忘れてはなりません。しかし、これは別の話です。

于 2012-10-31T16:06:08.893 に答える