Почему в GCC 5.1 включена оптимизация COW std :: string?

Согласно странице изменений релиза 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.

4

Решение

Некоторые дистрибутивы намеренно отклоняются от выбора 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.

8

Другие решения


По вопросам рекламы [email protected]