我知道在 C++03 中,从技术上讲,std::basic_string
模板不需要具有连续的内存。但是,我很好奇实际上利用这种自由的现代编译器有多少实现。例如,如果想用来basic_string
接收某个 C API 的结果(如下例所示),分配一个向量只是为了立即将其转换为字符串似乎很愚蠢。
例子:
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
是连续的,因此在面向该标准时,上述问题不是问题。