Подтвердить что ты не робот

Является ли std::string refcounted в GCC 4.x/С++ 11?

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

4b9b3361

Ответ 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 включена по умолчанию, используя небольшую оптимизацию строк вместо подсчета ссылок копирования на запись.