![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
WiND, inline нужно использовать тогда, когда без него нельзя или явно видно, что функцию надо встраивать в код (геттеры/сеттеры). В остальных случаях - используй второй вариант. |
|||
|
||||
WiND |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2006 Репутация: нет Всего: нет |
Вот это уже не так. Классы пихать в один файл, практически всегда приносит больше путаницы.
Если скажем 4 маленьких модуля по несколько функций, модули тематически разные, то получается уже не 2 вместо одного, а 8, вместо 4=) Вот выдержка из какой-то учебной книжки:
Возможно, я опять недопонял ) но если верить этому тексту, то bilbobagginz был прав в отношении подстановки. и раздутие кода походу тоже получается. Но опять же, почти все стандартные хидеры что я видел, все из inline-ов. Не может же быть так, что по сути это макросы=) Тогда получается, что, как сказал bsa, компилятор сам решает когда ему использовать фун-ю как макрос, а когда, как функцию. Стало быть, как определить, когда он что делает, только дизасмить? 2mes, спасибо за ответ ) |
||||||
|
|||||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
||||
|
||||
WiND |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2006 Репутация: нет Всего: нет |
2mes, проверил в дизасме, оказывается он подставляет только полностью идентичные.
А в случаи, если параметры макроса отличаются, адреса тоже отличаются. Логично конечно почему так получается)) А сделать так, чтобы на название команды он ссылался на один адрес, а на параметры - другой адрес. Хотя, я уже неуверен, что мне это нужно. Возможно проще ввести одну функцию, принимающую сколь угодно параметров, а в качестве первого - название команды. и через свитч подставлять макросы) Но в таком случаи, я не уверен, что цель оправдает средства) |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
inline-функция и функция_помеченная_как_inline - разные вещи. 1. функция не обязательно должна быть помечена как inline чтоб стать inline-функцией 2. функция помеченная как inline не обязательно станет inline-функцией.
Это не нужно для преобладающего большинства задач. вообще то не стоит сравнивать инлайн-функцию и макрос - общего в них мало. ![]() |
|||
|
||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
надо просто познакомиться с компилятором поближе. в общем как и указал bsa, inline - это "предложение" компайлеру. поэтому, все будет как я указал только если компайлер "решится, и пойдет на это". есть компайлеры, которых можно попросить "настоятельно", но вообще лучше не вмешиваться в этот механизм, а дать компайлеру "делать свою работу". я думаю, когда есть указание компайлеру оптимизировать на скорость, то он старается использовать инлайн почаще. но в общем это надо почитать мануальчик какого-то конкретного компайлера. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Ну так о том и говорилось ![]()
Ну тогда сделайте, чтоб было отдельно название, отдельно параметры ![]() у Вас же после препроцессора получается из параметров одна строка, которая и поступает компилятору. Это сообщение отредактировал(а) mes - 12.2.2010, 19:11 |
||||
|
|||||
WiND |
|
||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2006 Репутация: нет Всего: нет |
Т.е может получиться так, что какая-то гигантская функция, стала инлайн. Компилятор просто так захотел, а я ее определил в классе и не указывал inline?) Добавлено через 5 минут и 49 секунд
Тогда получится CONSTA+MACRO_COMMAND это не совсем красиво=)) Но в этом случаи придется уже использовать strcpy, а это еще лишний код) Если конечно я чего-то не знаю )) |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Теоретически - условно может.. если компилятор решит, что будет значительный выйгрыш скорости от этого на фоне скорости выполнения функции. Практически - не может, так как большая функция состоит из множества команд, на фоне общего времени выполнения которых, время лишнего вызова незначительно. |
|||
|
||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Хотя, в любом случае все зависит от конкретного компилятора. Добавлено через 1 минуту и 20 секунд
|
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
![]() Пример (очень синтетический, но все же)
Если компилятор заинлайнит func2 в func, то после этого он может поменять 2 for'а местами и сделать заполнение массива по строкам, что может быть на несколько порядков эффективнее |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
никто, кроме разумного взгляда на необходимость такого решения. плюс говоря о большой функции я полагал, опираясь на предыдущие высказывания автора, что речь идет о функции, представляемой большим результативным(асм) кодом. Так вот например очень большой шаблон в исходных кодах часто бывает представлен малым кол-во машинных команд результативного кода и соответсвенно вполне inlineable. ![]() |
|||
|
||||
unicuum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 16.3.2005 Где: Рашка Репутация: нет Всего: 8 |
А ещё написано, что полагаться на поведение компилятора нельзя, лучше следовать стандарту. На вопрос автора: макросы не рекомендуют использовать, если можно обойтись без них. В страже включения они оправданы вместе с директивой #pragma once. Для записи строковых литералов однозначно нет. -------------------- ![]() обычный день на винграде |
|||
|
||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Да лучше, но стандарт в данном вопросе отмалчивается, оставляя принятие решения о способе хранения строковых литералов на совести разработчиков компилятора.
Не совсем так. Не рекомендуется использовать в качестве функций. ![]()
стражи включения - это один из правильных способ использования макросов. при чем тут "pragma once" и что значит "вместе" в данном контексте не понял.. какие Вы однoзначные.. a я бы с Вами не согласился ![]() Добавлено через 54 секунды насчет однозначности |
||||||
|
|||||||
WiND |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2006 Репутация: нет Всего: нет |
Всем спасибо=) выполняю приказ bsa))
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |