gpt4 book ai didi

c++ - 以 C++03 为目标时,使用 std::basic_string 作为连续缓冲区是否合理?

转载 作者:IT老高 更新时间:2023-10-28 12:41:42 40 4
gpt4 key购买 nike

我知道在 C++03 中,技术上 std::basic_string 模板不需要具有连续内存。但是,我很好奇实际上利用这种自由的现代编译器有多少实现。例如,如果想使用 basic_string 来接收某些 C API 的结果(如下例),分配一个 vector 只是为了立即将其转换为字符串似乎很愚蠢。

例子:

DWORD valueLength = 0;
DWORD type;
LONG errorCheck = RegQueryValueExW(
hWin32,
value.c_str(),
NULL,
&type,
NULL,
&valueLength);

if (errorCheck != ERROR_SUCCESS)
WindowsApiException::Throw(errorCheck);
else if (valueLength == 0)
return std::wstring();

std::wstring buffer;
do
{
buffer.resize(valueLength/sizeof(wchar_t));
errorCheck = RegQueryValueExW(
hWin32,
value.c_str(),
NULL,
&type,
&buffer[0],
&valueLength);
} while (errorCheck == ERROR_MORE_DATA);

if (errorCheck != ERROR_SUCCESS)
WindowsApiException::Throw(errorCheck);

return buffer;

我知道这样的代码可能会稍微降低可移植性,因为它暗示 std::wstring 是连续的——但我想知道这使得该代码的可移植性如何。换句话说,编译器如何真正利用非连续内存所允许的自由?


编辑:我更新了这个问题以提及 C++03。读者应注意,在面向 C++11 时,该标准现在要求 basic_string 是连续的,因此在面向该标准时,上述问题是没有问题的。

最佳答案

我认为假设 std::string 连续分配其存储空间是非常安全的。

目前,所有已知的 std::string 实现都是连续分配空间的。

此外,C++ 0x (N3000) 的当前草案 [编辑:警告,直接链接到大 PDF] 要求空间连续分配 (§21.4.1/5):

The char-like objects in a basic_string object shall be stored contiguously. That is, for any basic_string object s, the identity &*(s.begin() + n) == &*s.begin() + n shall hold for all values of n such that 0 <= n < s.size().

因此,当前或 future 使用非连续存储实现 std::string 的可能性基本上为零。

关于c++ - 以 C++03 为目标时,使用 std::basic_string<t> 作为连续缓冲区是否合理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2256160/

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