Эффективность класса C ++ - PullRequest
0 голосов
/ 17 мая 2018

У меня есть старый класс строк, который я написал несколько лет назад (до того, как стандартная библиотека стала настолько стандартной).Это работает хорошо, но я полагаю, что я должен перейти в 21-й век на моем последнем проекте.Мне было интересно, насколько эффективен стандартный строковый класс библиотеки.Например, если я передаю строку в функцию или просто назначаю ее другой строке, она копирует данные или просто копирует указатель на данные.

В моем старом классе я держал счетчик ссылок с данными и просто копировал указатель.Если бы я сделал что-то, что изменило строку на месте, я бы проверил, была ли ее ссылка 1. Если это было 1, я мог бы использовать ту же самую область данных строки, предполагая, что строка не превысила свой первоначальный размер.Если бы оно было больше 1, я бы скопировал строковые данные перед его изменением.

Делает ли класс стандартной библиотеки что-то похожее (или, возможно, лучше), или копирует данные каждый раз, когда вы передаете строки.Я думаю, это может зависеть от реализации.Я в настоящее время разрабатываю для Windows, хотя я, вероятно, буду портировать его позже.Спасибо

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

С раздутым интерфейсом std::string вы получаете копирование на потенциальный -запись, что намного менее эффективно.

Например, в char& c = s[i]; c = 'a'; присваиванию c не разрешено выбрасывать bad_alloc, если необходимо создать отдельный элемент COW, когда s становится общим. Поэтому в каждом неконстантном вызове мы должны расшаривать строку для s[i], на всякий случай.

На практике это ограничивает потенциал совместного использования много , а также добавляет много кода if (shared) unshare(); для многих строковых функций-членов. В многопоточном коде это реальный фактор снижения производительности, так как unshare() придется блокировать объект при отмене общего доступа.

0 голосов
/ 17 мая 2018

Оптимизация небольших строк оказалась более эффективной в большинстве случаев, чем COW. Это не гарантированная победа, хотя; это может сильно зависеть от того, как именно он используется. Однако я бы сказал, что вы всегда можете использовать std::shared_ptr<std::string> для реализации своего класса COW и сэкономить много ручного управления памятью.

Суть в том, что std::string на , вероятно, лучше, но детали здесь могут повлиять. Попробуйте, но будьте осторожны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...