std::basic_stringC ++ 03では、技術的にはテンプレートに連続したメモリが必要ないことを知っています。ただし、この自由を実際に利用する最新のコンパイラーには、いくつの実装が存在するのか興味があります。たとえば、basic_stringC 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に言及するためにこの質問を更新しました。basic_string読者は、C ++ 11を対象とする場合、標準では連続している必要があることに注意する必要があります。したがって、その標準を対象とする場合、上記の質問は問題になりません。