gpt4 book ai didi

c - API设计——分配输出?

转载 作者:太空狗 更新时间:2023-10-29 17:22:32 25 4
gpt4 key购买 nike

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 主要使用第二种情况(例如 GetWindowTextLookupAccountSid )。如果 API 函数知道输出有多大,为什么还要让用户尝试猜测输出大小?我找不到关于为什么使用第二种情况的任何信息。

此外:LookupAccountSid 示例特别糟糕。它在内部使用 LSA API,为调用者分配输出。然后 LookupAccountSid 让用户在它可以从 LSA 返回输出时分配一个缓冲区(并猜测正确的缓冲区大小)!为什么?

最佳答案

Win32 API 不预先分配缓冲区,因为它想让调用代码选择如何提供缓冲区。它允许他们提供堆栈和各种基于堆的缓冲区。有几个地方缓冲区的最大大小是提前知道的,开发人员希望使用基于堆栈的缓冲区的简单性。

文件系统是最好的例子,因为路径不会超过 MAX_PATH。所以而不是分配+免费。开发人员只需声明一个基于堆栈的缓冲区。

让 C API 分配内存的好处是它简化了调用模式。 Win32 模式的缺点是大多数时候您最终会调用 API 两次。第一次确定缓冲区的大小,然后第二次使用适当大小的缓冲区。使用 API 分配的缓冲区只需要一次调用。

缺点是你从调用者那里拿走了分配的选择。此外,您必须传达您的选择,以便他们正确释放 API(例如,windows 可以从几个不同的地方分配)。

关于c - API设计——分配输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2090311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com