C/C++

С++. Является ли замена string на char, где это возможно, оптимизацией кода?

Это зависит от задачи. Нет смысла просто так менять одно на другое.
В современных приложениях надо использовать Unicode символы. Есть несколько разновидностей Unicode. В некоторых случаях более эффективно использовать символы wchar_t (char16_t) или даже 32-битные коды символов (char32_t). Например, для системных функций Windows wchar_t (UTF-16LE) - это стандартная кодировка.
Андрей Никитин
Андрей Никитин
58 065
Лучший ответ
Строго говоря, да. Но этим не следует пользоваться, так же как не следует пользоваться Ассемблером вместо С. string гораздо более мощен и удобен, чем *char. А оптимизацией неплохо занимаются и современные компиляторы.
*саня
52 034
Если рассматривать оптимизацию с точки зрения экономии памяти, то char по сравнению со string экономичней, так как char - базовый (встроенный) тип, занимающий в C++ всего 1 байт для одного символа, а string это как минимум структура, имеющая дополнительные свойства (поля) для обработки хранящегося значения. Значит string гораздо больше жрёт памяти там, где хранится или создаётся. Но char, а точнее char*, это чисто Си-шная тема, где многие функции заточены под этот тип. Например:

char* st="\n\tТекст с новой строки и с табуляцией\n".
//Строковая переменная в виде массива символов:
char str[50]="Строка длиной до 50 букв\0";
printf("%s",str);//выводим строку-массив
printf("%s",st);//выводим текст
str[0]=st;//присваиваем массиву текст, обязательно с нулевой позиции массива
printf("%s",str);//выводим новое значение
//Мои примеры работают на Андроид и в Линукс. В тупой Винде со старой аски-кодировкой отобразятся только латинские символы)))

Многобайтовые символы, например, кириллица, в Си пишутся уже не в char*, а с помощью wchar_t*
Для обработки char* в C++ у некоторых классов встречаются методы типа c_str(). Как в C++ обстоят дела с wchar_t* не в курсе, так как работаю в основном в Си.
используйте char массив фиксированной длинны
а) - это будет быстрее по обработке программы
б) - но накладнее по времени в описании дополнительх функций по обработке данного char массива

3) а string удобнее простой контейнер
а) - из за того что это класс с более удобными методами перебора символов
б) - но менее быстрый
Как правило совсем наоборот.

Важно понимать что string является классом со внутренней организацией а char базовым типом языка. Внутренняя организация в классе может самостоятельно изменятся в зависимости от задачи никак при этот не влияя на код приложения.
В общем используются инкапсуляция скрывающая внутреннею реализацию.

К примеру даже простое сжатие по Хоффману используемое внутри класса снаружи класса никак не заметно а потреблении памяти уменьшается в 4-8 раз примерно на столько же и увеличивается скорость работы с такими строками.

Классов реализующих работу со строками вагон и маленькая тележка от совсем простых и тупых навроде std::string до крайне сложных математических моделей используемых в базах данных, дотнете и джаве.
Максим Федякин
Максим Федякин
12 592
Андрей Никитин Ни одна библиотека строк не сжимает данные :-) Для сжатия данных есть отдельные библиотеки. Для эффективного сжатия нужен достаточно большой объём данных. Кодировка Хаффмана сама по себе слабо сжимает. Её используют совместно с другими методами. Ещё есть арифметическое кодирование. Оно похоже на код Хаффмана, но более эффективно.
Если вы пишите для чего-то вроде ардуино, то да. Если для компа, то не стоит свеч это гемор.
Александр Sashak
Александр Sashak
7 893