Пересчитана ли std :: string в GCC 4.x / C ++ 11?

Является std::string счетчик ссылок при использовании gcc 4 с -std=c++0x или же -std=c++11?

29

Решение

Смотря на документация по libstdc ++ Я нахожу (см. Ссылку для получения дополнительной информации):

Строка выглядит так:

                       [_Rep]
_M_length
[basic_string<char>]   _M_capacity
_M_dataplus            _M_refcount
_M_p ----------------> unnamed array of char_type

Так что да, это ссылка считается. Также из обсуждения Вот:

Да, std :: string будет сделан без подсчета ссылок в какой-то момент,
но поскольку строка без учета ссылок действительна и в C ++ 98,
вариант будет переключаться на строку без подсчета ссылок для обоих
Режимы -std = c ++ 98 и -std = c ++ 11. Я не говорю, что это произойдет, но это может быть.

Таким образом, кажется, есть планы изменить его, чтобы он соответствовал (хотя я не знаю, как продвигается прогресс).

Обновить
Как указывает emsr в комментариях, в настоящее время существует расширение без учета ссылок, называемое vstring.hи, похоже, единственная причина, по которой он не заменил std::string это из-за совместимости ABI. Есть такой вопрос по этому поводу Вот.

23

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

C ++ 11 добавил специфический язык запрещающее std::string из ссылки считается. Так что, если это так, то это довольно существенный сбой в стандартной библиотеке GCC C ++ 11.

22

Добавление некоторой полезной информации, которая пост-даты этого вопроса.

std::string будут больше никогда быть подсчитанным со ссылкой на выпуск GCC 5, чтобы удовлетворить это требование C ++ 11.

От https://gcc.gnu.org/gcc-5/changes.html

Новая реализация std :: string включена по умолчанию, используя небольшую строковую оптимизацию вместо подсчета ссылок при записи.

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