Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/29: Рейтинг темы: голосов - 29, средняя оценка - 5.00
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

C строки vs string

05.02.2020, 17:38. Показов 7913. Ответов 78
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
почему первая программа выполнится медленнее в 2 раза чем вторая?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main() {     
  int errors = 0;    
  const char *pc = "a very long literal string";     
  for ( int ix = 0; ix < 1000000; ++ix )     {          
    int len = strlen( pc );          
    char *pc2 = new char[ len + 1];           
    strcpy( pc2, pc );          
    if ( strcmp( pc2, pc ))                
      ++errors;           
    delete [] pc2;     
  }     
  std::cout << "C-strings: "          << errors << " errors.\n"; 
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
int main() {     
  int errors = 0;     
  std::string str( "a very long literal string" );     
  for ( int ix = 0; ix < 1000000; ++ix )     {           
    int len = str.size();           
    std::string str2 = str;
    if (str != str2)
      ++errors;
  }     
  std::cout << "string class: "
    << errors << " errors.\n";
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2020, 17:38
Ответы с готовыми решениями:

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

Разделение строки на 2 подстроки с последующей записью последних в HashMap<String, String>
Дорбого времени суток. Застрял на такой глупости блок кода который читает построчно тхт файл и должен разбивать строку и две подстроки...

Несколько вопросов по примеру из книги по C# про строки (string и String.Format)
Я нашел такой пример кода: private void butFormatStr_Click(object sender, EventArgs e { string AutoName; AutoName =...

78
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
05.02.2020, 22:23
Студворк — интернет-сервис помощи студентам
ReYalp, какое издание? В 5-м не нахожу такого.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
05.02.2020, 22:24
Цитата Сообщение от ReYalp Посмотреть сообщение
UB бывает если читать с неактивного поля и все?
Если читать то, да, UB, но не в этом случае, я ошибся.
У меня по замерам примерно работает в одинаковое время, без учитывания SSO (чаще выигрывает версия с Си строками и memcpy).
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
05.02.2020, 22:52
Цитата Сообщение от ReYalp Посмотреть сообщение
издание 3
Лучше 5 читайте.

Да, действительно некоторые реализации string в старом С++ использовали COW. Поэтому копирование
C++
1
std::string str2 = str;
было почти бесплатным (просто увеличивался счетчик ссылок, память не выделялась).

Вот демонстрация работы в "старом" режиме: https://rextester.com/KVKNG24392

Добавлено через 10 минут
Цитата Сообщение от ReYalp Посмотреть сообщение
даже с вычислением strlen
Компилятор не глупый, и сам вынесет ваш одинаковый strlen за цикл. Так что совет выше по ручному вынесению полезен только в общеобразовательных целях (лучше выносить, а не полагаться на компилятор, но в данном случае это не играет роли). Тем более, что это пример из книги. Значит его положено (за исключением явных опечаток) использовать так, как есть.
Вот демо: https://gcc.godbolt.org/z/Ey_pmg
Обратите внимание, что в результирующем коде вообще нет вызова strlen, компилятор посчитал длину на этапе компиляции.
Assembler
1
        mov     edi, 27
Что касается SSO, то она тут не применяется, т.к. строка длиннее 16 символов.

Добавлено через 4 минуты
Вот демонстрация современной реализации с работой SSO (сократил размер строки, чтобы влезло в буфер):
https://rextester.com/RWIQ92807
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
05.02.2020, 22:54  [ТС]
DrOffset, почему SSO звучит так будто это какой-то супер механизм? Это же на деле просто массив в стеке, ничего необычного, насчёт 5го издания учту, только зря 100 страниц прочитал) ну ничего, заново перечитаю, но по сравнению со Страуструп ом Липпман во много раз интереснее пишет, хоть и не совсем для новичков тк с ходу о шаблонах указателя и тд
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
05.02.2020, 22:57
Цитата Сообщение от ReYalp Посмотреть сообщение
насчёт 5го издания учту, только зря 100 страниц прочитал
Да вряд ли зря. Многое не устарело.
Просто пятое издание описывает современный С++, поэтому неудивительно, что этого примера там уже нет.
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
05.02.2020, 22:57
Цитата Сообщение от DrOffset Посмотреть сообщение
string в старом С++ использовали COW
А чего в С++11 решили переписать?)
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
05.02.2020, 23:05
Цитата Сообщение от ReYalp Посмотреть сообщение
но по сравнению со Страуструп ом Липпман во много раз интереснее пишет
не бери грех на душу
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
05.02.2020, 23:09
Цитата Сообщение от Azazel-San Посмотреть сообщение
А чего в С++11 решили переписать?)
https://gist.github.com/alf-p-... 514204e755
2
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
05.02.2020, 23:14  [ТС]
_stanislav, а что такого?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
05.02.2020, 23:20
DrOffset, а мне вот если память не изменяет, то строки из библиотеки folly, реализованы именно через COW и работают даже в многопотоке, и совместимы с std строками. Получается они все эти проблемы решили?
folly/FBString.h
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
05.02.2020, 23:38
Цитата Сообщение от Azazel-San Посмотреть сообщение
Получается они все эти проблемы решили?
Скорее просто эти проблемы не играют значительной роли в сфере применения folly.
1
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
06.02.2020, 00:00
Цитата Сообщение от ReYalp Посмотреть сообщение
в данном случае активный член b , так?
Нет, т.к. имя b не ссылается на объект, чей lifetime начался и не закончился. Даже после obj.b = 8.0f;.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
06.02.2020, 00:03  [ТС]
argcargv, а как тогда его сделать активным?
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
06.02.2020, 00:05
ReYalp, пока [basic.life]/8 не починят --- никак.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.02.2020, 00:08
Цитата Сообщение от Avazart Посмотреть сообщение
ReYalp, гугли Small String Optimization (SSO)
Блин где то был видос про него от яндекс
Нашел таки...
c привязкой по времени: https://youtu.be/rJWSSWYL83U?t=1258

2
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
06.02.2020, 00:54
Цитата Сообщение от argcargv Посмотреть сообщение
пока [basic.life]/8 не починят --- никак
А что с ним не так?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
06.02.2020, 05:39
Цитата Сообщение от argcargv Посмотреть сообщение
[basic.life]/8
а что это такое? какой то документ стандарта?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
06.02.2020, 09:43
_stanislav, да, ссылка на пункт из стандарта, там о переиспользовании памяти идется.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
06.02.2020, 09:56
Цитата Сообщение от Azazel-San Посмотреть сообщение
да, ссылка на пункт из стандарта
как туда попасть?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
06.02.2020, 10:16  [ТС]
_stanislav, http://eel.is/c++draft/class.union#2 и тут сразу же basic.life в самом начале
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.02.2020, 10:16

Написать функция String->String, удаляющие из строки все согласные буквы
написать функция String-&gt;String, удаляющие из строки все согласные буквы с помощью функции filter и elem

Напишите функцию String->String, удаляющую из строки все гласные буквы используя функции filter и elem
Помогите, пожалуйста решить задачу. Напишите функцию String-&gt;String, удаляющую из строки все гласные буквы используя функции filter и...

Разработать функцию MakeStr(const S:string):string, возвращающую строку, состоящую из всех гласных латинских букв строки
1.Разработать функцию MakeStr(const S:string):string, возвращающую строку, состоящую из всех гласных латинских букв строки S без...

Нельзя преобразовать тип Tuple<string,string,string,string> к string
Здравствуйте, у меня возникла проблема. При запуске кода, вылезает ошибка &quot;Нельзя преобразовать тип...

Создайте класс Animal. Добавьте поля string Name, string Kind, string Areal, int Population
Создайте класс Animal. Добавьте поля string Name, string Kind, string Areal, int Population. Создание объектов может происходить как без...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru