@ Zenikoder, может быть, я не совсем понял, когда предложил использовать константные ссылки на строки? Все, что они вернут, будет не перезаписано и не должно вызывать копию.
должение обсуждения этоговопросМне было интересно, как тот, кто использует нативный C ++, программно определяет, использует ли используемая им реализация std :: stringКопирование при записи (COW)
У меня есть следующая функция:
#include <iostream>
#include <string>
bool stdstring_supports_cow()
{
//make sure the string is longer than the size of potential
//implementation of small-string.
std::string s1 = "012345678901234567890123456789"
"012345678901234567890123456789"
"012345678901234567890123456789"
"012345678901234567890123456789"
"012345678901234567890123456789";
std::string s2 = s1;
std::string s3 = s2;
bool result1 = (&s1[0]) == (&s2[0]);
bool result2 = (&s1[0]) == (&s3[0]);
s2[0] = 'X';
bool result3 = (&s1[0]) != (&s2[0]);
bool result4 = (&s1[0]) == (&s3[0]);
s3[0] = 'X';
bool result5 = (&s1[0]) != (&s3[0]);
return result1 && result2 &&
result3 && result4 &&
result5;
}
int main()
{
if (stdstring_supports_cow())
std::cout << "std::string is COW." << std::endl;
else
std::cout << "std::string is NOT COW." << std::endl;
return 0;
}
Проблема в том, что я не могу найти цепочку инструментов C ++, где она возвращает true. Есть ли недостаток в моем предположении о том, как COW реализован для std :: string?
Обновить: Основываясь на комментариях Котлински, я изменил использование в функции ссылок на запись (datable) для функции data (), теперь для некоторых реализаций он, похоже, возвращает «true».
bool stdstring_supports_cow()
{
//make sure the string is longer than the size of potential
//implementation of small-string.
std::string s1 = "012345678901234567890123456789"
"012345678901234567890123456789"
"012345678901234567890123456789"
"012345678901234567890123456789"
"012345678901234567890123456789";
std::string s2 = s1;
std::string s3 = s2;
bool result1 = s1.data() == s2.data();
bool result2 = s1.data() == s3.data();
s2[0] = 'X';
bool result3 = s1.data() != s2.data();
bool result4 = s1.data() == s3.data();
s3[0] = 'X';
bool result5 = s1.data() != s3.data();
return result1 && result2 &&
result3 && result4 &&
result5;
}
Примечание: согласноN2668: «Модификации параллелизма для базовой строки»в следующем стандарте C ++ 0x опция COW будет удалена из basic_string. спасибо Джеймсу и Белдазу за то, что подняли это.