Я знаю, что в С++ 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
является смежным - но мне интересно, насколько unportable делает этот код. Иными словами, как могут компиляторы использовать преимущества свободы с несмежной памятью?
EDIT: я обновил этот вопрос, чтобы упомянуть С++ 03. Читатели должны учитывать, что при таргетинге на С++ 11 стандарт теперь требует, чтобы basic_string
был смежным, поэтому вышеупомянутый вопрос не является проблемой при таргетинге на этот стандарт.