Согласно странице изменений релиза GCC 5 (https://gcc.gnu.org/gcc-5/changes.html):
Новая реализация std :: string включена по умолчанию, используя небольшую строковую оптимизацию вместо подсчета ссылок при записи
Я решил проверить это и написал простую программу:
int main()
{
std::string x{"blah"};
std::string y = x;
printf("0x%X\n", x.c_str());
printf("0x%X\n", y.c_str());
x[0] = 'c';
printf("0x%X\n", x.c_str());
printf("0x%X\n", y.c_str());
}
И результат:
0x162FC38
0x162FC38
0x162FC68
0x162FC38
Обратите внимание, что указатель x.c_str () изменяется после x [0] = ‘c’. Это означает, что внутренний буфер копируется при записи. Так что кажется, что COW все еще в работе. Зачем?
Я использую g ++ 5.1.0 на Ubuntu.
Некоторые дистрибутивы намеренно отклоняются от выбора FSF GCC по умолчанию для нового ABI. Вот объяснение того, почему Fedora 22 отличается от GCC выше по потоку. Короче:
В программе лучше не смешивать старый и новый ABI, а выбирать один и придерживаться его. Вещи ломаются, если одна часть программы принимает другое внутреннее представление для типа, чем другая часть программы.
Следовательно, если используется какая-либо библиотека C ++, использующая старый ABI C ++, то программы, использующие эту библиотеку, должны также использовать старый ABI C ++.
Следовательно, если используется какая-либо библиотека C ++, созданная с помощью GCC 4.9 или более ранней версии, то программы, использующие эту библиотеку, также должны использовать старый C ++ ABI.
Fedora 22 по-прежнему предоставляет (или предоставляет?) Множество библиотек, созданных с помощью GCC 4.9, потому что не было достаточно времени, чтобы перестроить их все с помощью GCC 5.1 до выпуска Fedora 22. Чтобы позволить программам использовать эти библиотеки, по умолчанию GCC был переключен на старый ABI.
Насколько я могу судить, GCC 5 еще не является компилятором по умолчанию в Ubuntu (но скоро будет), поэтому, если он будет предоставлен в качестве дополнительной установки, те же аргументы от Fedora также применимы к Ubuntu.