Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> стражи хидера не охраняют при инклуде!( 
V
    Опции темы
bsa
Дата 12.2.2010, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Alca @  12.2.2010,  17:58 Найти цитируемый пост)
это у тебя тут 2-3 функции, а если 20-30? И всех их заинлайнить? Тогда возможно раздутие кода.
Раздутие будет только в том случае, если они реально "заинлайнятся".

WiND, inline нужно использовать тогда, когда без него нельзя или явно видно, что функцию надо встраивать в код (геттеры/сеттеры). В остальных случаях - используй второй вариант.
PM   Вверх
WiND
Дата 12.2.2010, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



Цитата

Если на то пошло, тогда пихай классы в один файл. Меньше файлов - меньше путаниц.    

Вот это уже не так. Классы пихать в один файл, практически всегда приносит больше путаницы.

Цитата

два вместо одного  

Если скажем 4 маленьких модуля по несколько функций, модули тематически разные, то 
получается уже не 2 вместо одного, а 8, вместо 4=)

Вот выдержка из какой-то учебной книжки:
Цитата

Встраиваемые (inline) функции – это очень короткие функции, реализуемые небольшим числом машинных команд. К ним невыгодно обращаться с использованием стандартного механизма, требующего обязательной засылки передаваемых аргументов в стек, извлечения данных из стека, засылки возвращаемого результата в стандартный регистр и т.п. Гораздо проще на место вызова inline-функции вставить и настроить само тело функции. Это намного эффективнее, особенно в тех случаях, когда работа функции сводится к нескольким машинным командам. Такая техника компиляции напоминает процедуру макроподстановки в ассемблере или процесс обработки препроцессором директив #define.


Возможно, я опять недопонял ) но если верить этому тексту, то bilbobagginz был прав в отношении подстановки. и раздутие кода походу тоже получается.
Но опять же, почти все стандартные хидеры что я видел, все из inline-ов. Не может же быть так, что по сути это макросы=) Тогда получается, что, как сказал bsa, 
компилятор сам решает когда ему использовать фун-ю как макрос, а когда, как функцию. Стало быть, как определить, когда он что делает, только дизасмить?

2mes, спасибо за ответ )
PM MAIL   Вверх
bsa
Дата 12.2.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(WiND @  12.2.2010,  18:51 Найти цитируемый пост)
и раздутие кода походу тоже получается.

Цитата(WiND @  12.2.2010,  18:51 Найти цитируемый пост)
Тогда получается, что, как сказал bsa, 
компилятор сам решает когда ему использовать фун-ю как макрос, а когда, как функцию.

Оба утверждения верные. Когда происходит встраивание, код обычно увеличивается.
PM   Вверх
WiND
Дата 12.2.2010, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



2mes, проверил в дизасме, оказывается он подставляет только полностью идентичные.
А в случаи, если параметры макроса отличаются, адреса тоже отличаются. Логично конечно почему так получается))
А сделать так, чтобы на название команды он ссылался на один адрес, а на параметры - другой адрес.
Хотя, я уже неуверен, что мне это нужно.
Возможно проще ввести одну функцию, принимающую сколь угодно параметров, а в качестве первого - название команды. и через свитч подставлять макросы) Но в таком случаи, я не уверен, что цель оправдает средства)
PM MAIL   Вверх
mes
Дата 12.2.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(WiND @  12.2.2010,  17:51 Найти цитируемый пост)
Возможно, я опять недопонял ) 

inline-функция и функция_помеченная_как_inline   - разные вещи.
1. функция не обязательно должна быть помечена как inline чтоб стать inline-функцией
2. функция помеченная как inline не обязательно станет inline-функцией.

Цитата(WiND @  12.2.2010,  17:51 Найти цитируемый пост)
. Стало быть, как определить, когда он что делает, только дизасмить?

Это не нужно для преобладающего большинства задач.

Цитата(WiND @  12.2.2010,  17:51 Найти цитируемый пост)
Не может же быть так, что по сути это макросы=) 

вообще то не стоит сравнивать инлайн-функцию и макрос - общего в них мало.

smile


--------------------
PM MAIL WWW   Вверх
bilbobagginz
Дата 12.2.2010, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: нет
Всего: 317



Цитата(WiND @  12.2.2010,  17:51 Найти цитируемый пост)
Возможно, я опять недопонял ) но если верить этому тексту, то bilbobagginz был прав в отношении подстановки

надо просто познакомиться с компилятором поближе.
в общем как и указал bsa, inline - это "предложение" компайлеру.
поэтому, все будет как я указал только если компайлер "решится, и пойдет на это".

есть компайлеры, которых можно попросить "настоятельно", 
но вообще лучше не вмешиваться в этот механизм, 
а дать компайлеру "делать свою работу".

Цитата(WiND @  12.2.2010,  17:51 Найти цитируемый пост)
Стало быть, как определить, когда он что делает, только дизасмить?

я думаю, когда есть указание компайлеру оптимизировать на скорость, то он старается использовать инлайн почаще.

но в общем это надо почитать мануальчик какого-то конкретного компайлера.



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
mes
Дата 12.2.2010, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(WiND @  12.2.2010,  18:03 Найти цитируемый пост)
проверил в дизасме, оказывается он подставляет только полностью идентичные.

Ну так о том и говорилось smile

Цитата(WiND @  12.2.2010,  18:03 Найти цитируемый пост)
А сделать так, чтобы на название команды он ссылался на один адрес, а на параметры - другой адрес.

Ну тогда сделайте, чтоб было отдельно название, отдельно параметры smile 
у Вас же после препроцессора получается из параметров одна строка, которая и поступает компилятору.





Это сообщение отредактировал(а) mes - 12.2.2010, 19:11


--------------------
PM MAIL WWW   Вверх
WiND
Дата 12.2.2010, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



Цитата

1. функция не обязательно должна быть помечена как inline чтоб стать inline-функцией

Т.е может получиться так, что какая-то гигантская функция, стала инлайн. Компилятор просто так захотел, а я ее определил в классе и не указывал inline?)

Добавлено через 5 минут и 49 секунд
Цитата

Ну тогда сделайте, чтоб было отдельно название, отдельно параметры  

Тогда получится CONSTA+MACRO_COMMAND это не совсем красиво=)) Но в этом случаи придется уже использовать strcpy, а это еще лишний код) Если конечно я чего-то не знаю ))

PM MAIL   Вверх
mes
Дата 12.2.2010, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(WiND @  12.2.2010,  18:10 Найти цитируемый пост)
Т.е может получиться так, что какая-то гигантская функция, стала инлайн. Компилятор просто так захотел, а я ее определил в классе и не указывал inline?) 

Теоретически - условно может.. если компилятор решит, что будет значительный выйгрыш скорости от этого на фоне скорости выполнения функции.
Практически - не может, так как большая функция состоит из множества команд, на фоне общего времени выполнения которых, время лишнего вызова незначительно.



--------------------
PM MAIL WWW   Вверх
bsa
Дата 12.2.2010, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(mes @  12.2.2010,  19:16 Найти цитируемый пост)
Практически - не может, так как большая функция состоит из множества команд, на фоне общего времени выполнения которых, время лишнего вызова незначительно.
А кто ему помешает, если функция больше нигде не используется?
Хотя, в любом случае все зависит от конкретного компилятора.

Добавлено через 1 минуту и 20 секунд

M
bsa
Завязываем с оффтопиком!
WiND, ответ по поводу стражей ты получил? Если да, то пометь тему решенной

PM   Вверх
xvr
Дата 12.2.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



 smile Когда компилятор решает сделать inline функции по своему усмотрению, то очень часто это может быть сделанно не из соображений экономии на вызове, а из соображений оптимизации. Подстановка функции в место вызова может позволить компилятору применить более агрессивную оптимизацию.
Пример (очень синтетический, но все же)
Код

#define BIG_CONST 10000
void func(int arr[BIG_CONST][BIG_CONST])
{
  for(int i=0;i<BIG_CONST;++i)
   func2(arr,i);
}

void func2(int arr[BIG_CONST][BIG_CONST], int idx)
{
 for(int i=0;i<BIG_CONST;++i)
  arr[i][idx]=0;
}
Данный код заполняет массив arr нулем по столбцам, что крайне неэффективно в смысле использования кэшей
Если компилятор заинлайнит func2 в func, то после этого он может поменять 2 for'а местами и сделать заполнение массива по строкам, что может быть на несколько порядков эффективнее

PM MAIL   Вверх
mes
Дата 12.2.2010, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(bsa @  12.2.2010,  19:58 Найти цитируемый пост)
А кто ему помешает, если функция больше нигде не используется?

никто, кроме разумного взгляда на необходимость такого решения.

плюс говоря о большой функции я полагал, опираясь на предыдущие высказывания автора, что речь идет о функции, представляемой большим результативным(асм) кодом. 
Так вот например очень большой шаблон в исходных кодах часто бывает представлен малым кол-во машинных команд результативного кода и соответсвенно вполне inlineable. 
smile




--------------------
PM MAIL WWW   Вверх
unicuum
Дата 12.2.2010, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: нет
Всего: 8



Цитата(mes @  12.2.2010,  18:28 Найти цитируемый пост)

все одинаковые строковые литералы современный компилятор самостоятельно "объединяет", т.е. в теле программы будут определены единожды.

А ещё написано, что полагаться на поведение компилятора нельзя, лучше следовать стандарту. На вопрос автора: макросы не рекомендуют использовать, если можно обойтись без них. В страже включения они оправданы вместе с директивой #pragma once. Для записи строковых литералов однозначно нет.


--------------------
user posted image
обычный день на винграде
PM   Вверх
mes
Дата 12.2.2010, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(unicuum @  12.2.2010,  20:38 Найти цитируемый пост)

А ещё написано, что полагаться на поведение компилятора нельзя, лучше следовать стандарту.

Да лучше, но стандарт в данном вопросе отмалчивается, оставляя принятие решения о способе хранения строковых литералов на совести разработчиков компилятора.

Цитата(unicuum @  12.2.2010,  20:38 Найти цитируемый пост)
На вопрос автора: макросы не рекомендуют использовать, если можно обойтись без них.

Не совсем так. Не рекомендуется использовать в качестве функций. smile

Цитата(unicuum @  12.2.2010,  20:38 Найти цитируемый пост)
В страже включения они оправданы вместе с директивой #pragma once. 

стражи включения - это один из правильных способ использования макросов.
при чем тут "pragma once" и что значит "вместе" в данном контексте не понял..

Цитата(unicuum @  12.2.2010,  20:38 Найти цитируемый пост)
Для записи строковых литералов однозначно нет. 

какие Вы однoзначные.. a я бы с Вами не согласился smile

Добавлено через 54 секунды
насчет однозначности



--------------------
PM MAIL WWW   Вверх
WiND
Дата 13.2.2010, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.12.2006

Репутация: нет
Всего: нет



Всем спасибо=) выполняю приказ bsa))
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1182 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.