Je sais qu'en C++03, techniquement, l' std::basic_string
modèle n'est pas nécessaire d'avoir de la mémoire contiguë. Cependant, je suis curieux de voir comment de nombreuses implémentations existent pour les compilateurs modernes que réellement profiter de cette liberté. Par exemple, si on veut utiliser basic_string
de recevoir les résultats de certaines API C (comme dans l'exemple ci-dessous), il semble idiot d'allouer un vecteur juste pour le transformer en une chaîne de caractères immédiatement.
Exemple:
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;
Je sais que ce type de code peut légèrement réduire la portabilité, car elle implique que l' std::wstring
est contiguë, mais je me demandais juste comment portables qui fait de ce code. Autrement dit, comment peut compilateurs fait profiter de sa liberté d'avoir non contigus de la mémoire?
EDIT: j'ai mis à jour cette question de parler de C++03. Les lecteurs sont priés de noter que lors du ciblage de C++11, la norme exige maintenant que basic_string
être contiguës, de sorte que la question ci-dessus est un non-problème lors du ciblage de cette norme.