Основы работы со строками - PullRequest
0 голосов
/ 02 августа 2020

Пока я знаю следующие способы создания строк в C ++ (хотя некоторые из них взяты из C)

string string1 = "Hello";
char string2[] = "Hello";
char string3[] = {'H', 'e', 'l', 'l', 'o', 0};
const char *string4 = "Hello";
  1. Я считаю, что первый метод наиболее удобен, поскольку он поддерживает несколько методов и имеет перегруженные операторы. Но я считаю, что это также делает его наименее оптимизированным с точки зрения производительности, не так ли?
  2. Какой метод является лучшим с точки зрения производительности / скорости?
  3. Какие из них размещены в стеке а какой на куче? То есть я не вижу ни одного ключевого слова new, но тогда моя интуиция говорит иначе.

1 Ответ

3 голосов
/ 02 августа 2020

Я считаю, что первый метод наиболее удобен, поскольку он поддерживает несколько методов и имеет перегруженные операторы.

Верно. И это должен быть способ по умолчанию для обработки строк в C ++.

Но я считаю, что это также делает его наименее оптимизированным с точки зрения производительности, не так ли?

Наименее оптимизирован? За что? Что касается обычного приложения, то std::string - это очень быстро. Он сильно оптимизирован для многих сценариев использования. Большое количество очень умных людей очень много работают, чтобы сделать это быстро. Взгляните на этот SO вопрос , где кто-то пытается реализовать одну из std::string операций самостоятельно, но не может превзойти std::string производительность.

Какой метод лучше по производительности / скорости?

std::string самый быстрый. Прежде чем сказать, что это не так, подумайте, как вы собираетесь использовать свои струны. Вы делаете что-либо из следующего?

  • Сравнение
  • Конкатенация
  • Передача строк в функциях
  • поиск

std::string может сделать все это очень быстро. Однако, если вы в конечном итоге используете const char* или массив символов, вам придется выполнять эти операции вручную , что почти наверняка будет медленнее , чем реализация std::string. Не говоря уже о различных проблемах с указателями и памятью, с которыми вам придется столкнуться.

Какие из них размещены в стеке, а какие в куче? Я имею в виду, что я не вижу никаких новых ключевых слов, но моя интуиция говорит об обратном.

Все строки, которые вы показали, находятся в стеке, даже std::string. std::string имеет встроенный SSO (оптимизация коротких строк), который сохраняет короткие строки в стеке.

...