![]() |
|
Модераторы: bsa |
![]()
|
|
| Torsten |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 10.6.2008 Где: Pskov Репутация: нет Всего: 7 |
Использовать define для этого точно не нужно, эта замена функции и в этом случае только усложнит сопровождение и отладку. Хотя бы вот такой код, уже приведет к неправельным действиям :
Использование inline - это лишь подсказка компилятору о том, что эту функцию стоит сделать inline, и совершенно не факт, что он это сделает.
Каким профайлером производились замеры ? --------------------
We have no begining, we have no end. We are infinite. |
||||||
|
|||||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: нет Всего: 32 |
Не поняла, почему и что имеется ввиду под nLength+1 ? Может аLength+1 ? Это не страшно: изменим имя параметра. Меня больше волновало _Us_SetLength(pUnicodeString, pUnicodeString->Length + 1), но вроде все нормально. Да простым QueryPerformanceCounter - ом |
|||
|
||||
| Torsten |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 10.6.2008 Где: Pskov Репутация: нет Всего: 7 |
Лучше профайлером, тогда более менее точно станет понятно, на что именно больше всего тратится ресурсов. Ну, тогда продолжайте использовать. Мое дело предупредить ^_^ --------------------
We have no begining, we have no end. We are infinite. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Дело не в имени, а в выражении. Насколько я знаю макрос может взять не все выражение, чтобы он взял все там нужно в выражении скобки поставить каждому параметру. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| bilbobagginz |
|
||||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
с т.з. скорости ? думаю тот, который побыстрей. если критерий проверки - скорость. как тут ранее написали, читабельность чуток понижается, следовательно такой кусок стоит объяснить. но в принципе он ничего сложного не делает, поэтому такой кусок объяснять - время убивать зря. множиться будет всегда, но можно сделать и быстрее, если не умножать, а делать побитовый & с нулём. поэтому, при условии, что длИны - представляются целыми типами, мой вариант таков:
_cbLen тут стоит запихать в скобочки, как сказал тов. Alexeis, но не обязательно. В данном конкретном случае это не страшно:
поведёт себя "хорошо", т.е х>y+z будет всегда идентично x>(y+z). НО, т.к. иногда действия с операндами, которые запихивают в макро дают нежелаемые результаты, не засовывать "операнды" макро в скобочки - плохой вкус. -------------------- Я ещё не демон. Я только учусь. |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
не стоит использовать define, нервные клетки не восстанавливаются...
Обычная функция делающая то-же самое будет не медленнее. Компилятор в состоянии разобраться, в каком контексте вызывается функция, если она вызывается один раз, то встраивание ничего не даст кроме увеличения объема кода. Если функция вызывается в цикле, то даст, и скорее всего она будет встроена. Так зачем брать на себя работу компилятора? |
|||
|
||||
| DRUID3 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 20.6.2005 Где: Kyyiv Репутация: нет Всего: 9 |
Это как??? Нет, он не всегда, причем далеко не всегда в состоянии разобраться... -------------------- Every time if you use Linux, you are joined to the communism... практика - критерий истины ... отделенной от нас пропастью субъективного восприятия... |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
нет
с тем примером в 2 строчки он пожалуй сможет разобраться. вообще чем меньше функция, тем больше шансов что она будет заинлайнена, если функция большая и выполняется долго, то стоимость ее вызова, по сравнению с выполнением самой функциии незначительна и встраивать смысла нет... Но все эти аспекты анализировать самостоятельно - занятие неблагодарное, так что лучше доверить это компилятору. Плюс функции в том, что в одном случае она будет встроена, в другом нет. Если она вызывается из 100 разных мест, то реально встраивать нужно в одном - двух, там где она часто вызывается и стоимость вызова большая. В остальных случаях проще вызвать... Ну а макрос на 100% разменяет объем на скорость, при этом разницы в скорости не будет, так как там где нужно функция будет то-же встроена... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Вот выдержка из справки по билдеру
Ни каких ограничений на то что функция не может возвращать значения или создавать локальные переменные. Это могут быть только ограничения отдельно взятого хилого компилятора. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| xvr |
|
||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Первый
Проверил - сделал вызовы обоих версих функции, скормил все это Intel компилятору (на Linux) - код АБСОЛЮТНО одинаковый! (см атач) Кроме того, у define'а есть еще один ОГРОМНЫЙ подводный камень:
Присоединённый файл ( Кол-во скачиваний: 4 )
tst.zip 1,35 Kb |
||||||||||||
|
|||||||||||||
| DRUID3 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 20.6.2005 Где: Kyyiv Репутация: нет Всего: 9 |
а как? да, вобщем-то верно. За тем исключением, что "вобщем-то". Иногда нужно четко что-то встроить. И очень не хочется "балансировать" на грани встроенного в компилятор автомата, который решает - встраивать или нет. Ни каких ограничений на то что функция не может возвращать значения или создавать локальные переменные. Это могут быть только ограничения отдельно взятого хилого компилятора. Это перечислены пункты когда функция точно не станет inline. И не факт, что в остальных случаях станет. Неплохо бы все-таки вспомнить как будет работать функция и на чем попытается сэкономить компилер. Врать не буду с борландом йа не работаю и не намереваюсь. Очень возможно, что он, например, преобразует внутри себя локальные переменные в глобалные и работает с их адресами и т.д... Я же свои злоключения высказал, они могут пригодиЦЦо и другим идущим по этому пути. Вообще было бы очень клево, если бы кто-то не поленился, посидел с дизассемблером и несколькими компиляторами и накатал статейку "о том, как не надо применять inline" -------------------- Every time if you use Linux, you are joined to the communism... практика - критерий истины ... отделенной от нас пропастью субъективного восприятия... |
|||
|
||||
| Любитель |
|
||||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: нет Всего: 92 |
ЭТо кто вам такую ерунду сказал?1
Ничего подобного. 100% на всех компиляторах - инлайна никогда не будет. Есть всякие форсирующие директивы, есть ключевое слово inline - хинт компилеру, есть оптимизатор. Ничего подобного. Простые рекурсии (читай - рекурсии, которые были не в тему) - любой хороший комплер в состоянии развернуть. |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 27 Всего: 154 |
а стек для чего? вот xvr написал исчерпывающий пост, что еще нужно? сидеть с дизассемблером не нужно, достаточно в release версии программы поставить брэйкпоинт в место вызова функции, например в цикле и когда он сработает клацнуть Show Disassembly, бегая отладчиком по рилиз версии, очень хорошо видно что и когда оптимизатор встраивает даже без дизассемблера, так как отладчик в заинлайненые функции не заходит. |
|||
|
||||
| varnie |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 48 Регистрация: 27.9.2007 Репутация: нет Всего: 0 |
Effective C++, Глава 1:
Правило 1:
|
|||
|
||||
| DRUID3 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 463 Регистрация: 20.6.2005 Где: Kyyiv Репутация: нет Всего: 9 |
Суровая правда жизни
А это тут то причем??? А подстановкой мы что экономим!!!??? угу... А еще надо хорошо учиться и слушать папу и маму... -------------------- Every time if you use Linux, you are joined to the communism... практика - критерий истины ... отделенной от нас пропастью субъективного восприятия... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |