Является ли std::string
ссылкой на подсчет при использовании gcc 4 с -std=c++0x
или -std=c++11
?
Является ли std::string refcounted в GCC 4.x/С++ 11?
Ответ 1
Глядя на документация libstdС++ Я нахожу (см. ссылку для получения дополнительной информации):
Строка выглядит так:
[_Rep]
_M_length
[basic_string<char>] _M_capacity
_M_dataplus _M_refcount
_M_p ----------------> unnamed array of char_type
Итак, да, он подсчитан. Кроме того, из обсуждения здесь:
Да, std::string в какой-то момент будет произведен отсчет без ссылок, но в качестве строки, не относящейся к ссылке, действительна также в С++ 98, одна вариант заключается в том, чтобы переключиться на строку без ref-count для обоих -std = С++ 98 и -std = С++ 11 режимов. Я не говорю, что произойдет, но это может быть.
Итак, кажется, что есть планы изменить его на соответствие (я не знаю, как продвигается прогресс).
Обновление
Как замечает emsr в комментариях, в настоящее время существует подсчетное число без ссылки, называемое vstring.h
, и, похоже, единственная причина, по которой он не заменил std::string
, - это совместимость с ABI. Здесь есть вопрос SO .
Ответ 2
С++ 11 добавил специальный язык запрещающий std::string
из подсчета ссылок. Итак, если это так, то это довольно значительная ошибка в стандартной библиотеке GCC С++ 11.
Ответ 3
Добавление некоторой полезной информации, которая отправляет этот вопрос.
std::string
будет больше не подсчитываться по ссылке с выпуском GCC 5 для удовлетворения этого требования С++ 11.
Из https://gcc.gnu.org/gcc-5/changes.html
Новая реализация std::string включена по умолчанию, используя небольшую оптимизацию строк вместо подсчета ссылок копирования на запись.