Pull to refresh

Comments 19

А можно ли жить в мире Windows без Qt и все строки хранить и обрабатывать как char в кодировке utf8 без необходимости в wchar_t?
В мире Windows без Qt есть мир GTK+, где все строки char* в UTF-8. Но это не плюсы, а Си.
Поздравляю с новым опытом!
А вы сравнивали эффективность/удобство использования/кол-во найденых ошибок (PVS-Studio и CppCat) с другими анализаторами в новом для вас поприще. Переняли ли какие то идеи, например от cppcheck?
Я имею ввиду не вообще сравнение, а на аутсорсовом проекте — в ежедневном использование.
Мы не использовали ежедневно другие анализаторы.
Но я и так могу сказать, что инкрементальный анализ PVS-Studio/CppCat удобнее, чем предлагают Cppcheck или SCA в Visual Studio.
for (i = 0; i < strlen(str.c_str()); ++i)

Мне всегда казалось что параметры цикла считаются 1 раз, оказывается нет.

Оказывается если компилить с -O (optimize), то количество итераций вычисляется в начале цикла, но это зависит от сложности кода.
Без -O каждую итерацию…

Кому интересно:
0013 C745FC00 		movl	$0, -4(%rbp)
     000000
001a EB04     		jmp	.L4
             	.L5:
001c 8345FC01 		addl	$1, -4(%rbp)
             	.L4:
0020 E8000000 		call	_Z9c_str_lenv
     00
0025 3B45FC   		cmpl	-4(%rbp), %eax
0028 0F9FC0   		setg	%al
002b 84C0     		testb	%al, %al
002d 75ED     		jne	.L5


Это только фишка C++ или других языков тоже?
PHP и Java работают так же.
Это фишка вообще всех языков. Языки из Algol-ветки (в частности Pascal) декларируют, что вычисление всяких функций должно происходить лишь однажды, но на практике компиляторы, скажем, Delphi всё равно делают как C/C++.

Всё просто: что будет, если у вас str в теле цикла меняется? В C/C++/Java/etc это законно. В Pascal это заботливо объявлено «undefined behavior» и, вроде как, программист виноват — но на практике компиляторы такие случаи обрабатывают всё равно.

Ну а дальше — если оптимизатор сможет, то он попробует цикл соптимизировать. Если сможет.
Самое интересное что в цикле for мне как бы не пришло в голову менять размер строки, скорее всего взял бы while
Просто как то в литературе указано
Если известно количество итераций за ранее, то for
Если не известно, то while

Но информация интересная, ее нужно популяризировать.
Ну вообще цикл for всегда описывался как
for (инициализатор; условие выхода; итератор)

В принципе достаточно естественно, что выражение условия выхода вычисляется каждый раз. Если хочется как-то ограничить количество итераций уменьшить количество вычислений и есть уверенность, что выражение в условии не поменяется — можно вычислить переменную, скажем
int length = str.length();
for (int i = 0 ; i < length ; i++) {
}

Вот только в такой ситуации нужно действительно иметь полную уверенность, что рассматриваемое выражение (в данном случае строка) не изменится в процессе выполнения цикла. Т.е. в данном случае — если строка инициализируется в этом же методе.
ну и если уж смотреть на тот же паскаль, то в паскале как раз нет — там изначально сказано:
for a :=Min to Max do…
при этом заранее сказано, что Min и Max вычисляется перед началом итераций однократно.
Так там и синтаксис цикла другой ;-)
Я же говорю про c-like syntax.
Мне кажется было бы класно добавить const модификатор в циклы, но пока нигде такого не встречал, к сожалению.
for (i = 0; i < const str.size(); ++i)
то что вы описываете — это то, как было всегда. Я мечтаю/предлагаю синтаксический сахар, который скажет компилятору посчитать размер строки только один раз, без ввода доп-переменных.
Sign up to leave a comment.