Это зависит от задачи. Нет смысла просто так менять одно на другое.
В современных приложениях надо использовать Unicode символы. Есть несколько разновидностей Unicode. В некоторых случаях более эффективно использовать символы wchar_t (char16_t) или даже 32-битные коды символов (char32_t). Например, для системных функций Windows wchar_t (UTF-16LE) - это стандартная кодировка.
C/C++
С++. Является ли замена string на char, где это возможно, оптимизацией кода?
Строго говоря, да. Но этим не следует пользоваться, так же как не следует пользоваться Ассемблером вместо С. string гораздо более мощен и удобен, чем *char. А оптимизацией неплохо занимаются и современные компиляторы.
Если рассматривать оптимизацию с точки зрения экономии памяти, то 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* 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 удобнее простой контейнер
а) - из за того что это класс с более удобными методами перебора символов
б) - но менее быстрый
а) - это будет быстрее по обработке программы
б) - но накладнее по времени в описании дополнительх функций по обработке данного char массива
3) а string удобнее простой контейнер
а) - из за того что это класс с более удобными методами перебора символов
б) - но менее быстрый
Как правило совсем наоборот.
Важно понимать что string является классом со внутренней организацией а char базовым типом языка. Внутренняя организация в классе может самостоятельно изменятся в зависимости от задачи никак при этот не влияя на код приложения.
В общем используются инкапсуляция скрывающая внутреннею реализацию.
К примеру даже простое сжатие по Хоффману используемое внутри класса снаружи класса никак не заметно а потреблении памяти уменьшается в 4-8 раз примерно на столько же и увеличивается скорость работы с такими строками.
Классов реализующих работу со строками вагон и маленькая тележка от совсем простых и тупых навроде std::string до крайне сложных математических моделей используемых в базах данных, дотнете и джаве.
Важно понимать что string является классом со внутренней организацией а char базовым типом языка. Внутренняя организация в классе может самостоятельно изменятся в зависимости от задачи никак при этот не влияя на код приложения.
В общем используются инкапсуляция скрывающая внутреннею реализацию.
К примеру даже простое сжатие по Хоффману используемое внутри класса снаружи класса никак не заметно а потреблении памяти уменьшается в 4-8 раз примерно на столько же и увеличивается скорость работы с такими строками.
Классов реализующих работу со строками вагон и маленькая тележка от совсем простых и тупых навроде std::string до крайне сложных математических моделей используемых в базах данных, дотнете и джаве.
Андрей Никитин
Ни одна библиотека строк не сжимает данные :-) Для сжатия данных есть отдельные библиотеки. Для эффективного сжатия нужен достаточно большой объём данных. Кодировка Хаффмана сама по себе слабо сжимает. Её используют совместно с другими методами. Ещё есть арифметическое кодирование. Оно похоже на код Хаффмана, но более эффективно.
Если вы пишите для чего-то вроде ардуино, то да. Если для компа, то не стоит свеч это гемор.
Похожие вопросы
- Создание функции std::size_t String::find(char ch)
- WINAPI C++ string в char
- Различие указателей int *; и char *;
- Значение типа const char* нельзя присвоить сущности типа char*
- Программа на C++ с переводом Char в Int и наоборот при переводе возвращает НИЧЕГО
- Сравнение элементов массива типа char с символом типа char
- Как конвертировать Char или Tchar или wchar_t в LPWSTR?
- Какой самый простой способ привести std::string в код ASCII?
- Что означает char* str и какие у нее особенности?
- Крашится программа после throw *char