6

C API 関数が出力を割り当てること、またはユーザーに出力バッファーを指定させることは良い考えですか? 例えば:

BOOL GetString(
    PWSTR *String
    );
...
PWSTR string;
GetString(&string);
Free(string);

BOOL GetString(
    PWSTR Buffer,
    ULONG BufferSize,
    PULONG RequiredBufferSize
    );
...
// A lot more code than in the first case

より具体的には、Win32 API が主に 2 番目のケース (たとえば、 GetWindowTextLookupAccountSid ) を使用する理由が気になります。API 関数が出力の大きさを知っている場合、なぜユーザーは出力サイズを推測しようとするのでしょうか? 2番目のケースが使用される理由に関する情報が見つかりません。

また、LookupAccountSid の例は特に悪いです。内部的には、呼び出し元に出力を割り当てる LSA API を使用します。次に、LookupAccountSid は、LSA から出力を返すことができる場合に、ユーザーにバッファーを割り当てます (そして、正しいバッファー サイズを推測します)。なんで?

4

2 に答える 2

6

Win32 API は、呼び出し元のコードにバッファーを提供する方法を選択できるようにするため、バッファーを事前に割り当てません。これにより、スタックおよびさまざまなヒープ ベースのバッファーを提供できます。バッファの最大サイズが事前にわかっている場所がいくつかあり、開発者はスタック ベースのバッファを簡単に使用したいと考えています。

パスが を超えることはないため、ファイル システムは最良の例MAX_PATHです。したがって、割り当て+無料ではなく。開発者は、スタック ベースのバッファを宣言するだけです。

C API でメモリを割り当てる利点は、呼び出しパターンが単純になることです。Win32 パターンの欠点は、ほとんどの場合、API を 2 回呼び出すことになることです。1 回目はバッファのサイズを決定し、2 回目は適切なサイズのバッファを使用します。API が割り当てられたバッファーでは、1 回の呼び出しのみが必要です。

ただし、欠点は、呼び出し元から割り当ての選択を奪うことです。さらに、API を適切に解放するために、選択を伝える必要があります (たとえば、ウィンドウはいくつかの異なる場所から割り当てることができます)。

于 2010-01-19T00:51:30.543 に答える
1

2番目のアプローチには、次のようないくつかの利点があります

  • 呼び出し元がメモリ割り当ての有効期間を管理できるようにします
  • 呼び出し元は、同じパターンに従うさまざまな呼び出しに割り当てられたメモリを再利用できます
  • スタックまたはヒープなど、提供するバッファを呼び出し元が決定できるようにします。
于 2010-01-19T00:54:01.487 に答える