|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
02.06.2012, 11:48 | #11 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Я тут многабукав написал. Если вкратце: лучше не уповать на компиль, а такие моменты самостоятельно выносить за пределы цикла, и не парить голову ни себе, ни компилятору.
А так, тут два момента: 1. strlen возвращает длину строки. Которая может измениться внутри тела цикла. Что-то я очень сомневаюсь, что компиляторы в состоянии проконтролировать такое. Но если реально проконтролирует, что в теле цикла значение строки не меняется - запросто оптимизирует. 2. Стандартные функции обычно запиливают под специфик-компилятора. Они запросто могут иметь специфик-деррективы, которые помогают компилятору оптимизировать их. Честно говоря, я не знаю ответа на твой вопрос. Надо смотреть что компилятор породит. Но думаю, что компилятор самостоятельно не сумеет догадаться, подставить константу вместо strlen Но я знаю, что компилятор попытается это сделать. И если компилятор догадается, что при одном и том же аргументе, результат вычисления функции будет один и тот же - то он самостоятельно этот момент может оптимизировать: Код:
Код:
Код:
Поэтому выражение a*b не является константой, и её поведение компилятор предсказать уже не сможет. Что касается обычных функций программиста, то компиль сможет оптимизировать цикл, только если эта функция какая нибудь простейшая inline |
03.06.2012, 02:06 | #12 |
Форумчанин
Регистрация: 28.05.2011
Сообщений: 309
|
Спасибо, Вам, Берс!
Прекрасно объяснили! Вопрос немного не по теме.. Зачем применять size_t если можно просто int ? Я часто вижу применение size_t..
Спеши медленно.
|
03.06.2012, 11:50 | #13 | |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Предположим что тебе нужен счетчик цикла, значение которого по смыслу является индексом элемента массива. Индекс элемента массива может быть отрицательным? А если индекс элемента не может быть отрицательным, почему ты в качестве индекса допускаешь тип данных, который может применять отрицательные числа? Правило очень простое: то, чего быть не должно - не должно произойти в принципе. Если тебе нужен индекс массива - используй беззнаковые типы, и это гарантирует, что значение индекса всегда будет больше или равно нулю. Превентивная форма защиты от возможных ошибок. size_t по смыслу нужно читать так: "тип, значением которого является размер типа данных". И по идее использовать его нужно тогда, когда требуется вернуть размер данных ( результат работы sizeof() ) Для беззнаковых интов правильнее использовать unsigned int Однако, меня парит писать длинные два слова, когда по сути тоже самое делает size_t. Коротко, и лаконично. Важно понимать, что size_t может оказаться не тем же самым, что и unsigned int (хотя лично я не встречал различий. Но они могут быть в 64битных системах). Однако size_t гарантированно беззнаковый. Так же, как и unsigned int. И для работы с беззнаковыми целыми ничем не отличается от unsigned int (если не требуется пасти различия между sizeof(size_t) и sizeof(unsigned int). |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
void to struct (C++) | slim>>> | Помощь студентам | 1 | 13.01.2011 20:52 |
Struct, union | HeLiO | Общие вопросы C/C++ | 6 | 29.12.2010 12:16 |
Struct | mansp | Общие вопросы C/C++ | 4 | 05.12.2010 20:00 |
Вопрос по Struct | cheblya | Общие вопросы C/C++ | 2 | 06.11.2009 11:42 |
STRUCT() | alexov | Общие вопросы C/C++ | 1 | 13.01.2009 18:13 |