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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> inline и define - выбор 
:(
    Опции темы
Riply
Дата 23.7.2008, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



Здравствуйте !
Допустим, у нас есть такая функция, которую мы собираемся вызывать 
так много раз, что и не сосчитаешь smile
Код

__inline NTSTATUS Us_SetLength(const PUNICODE_STRING pUs, const ULONG aLength)
{
  if (pUs->MaximumLength >= aLength)
   {
     pUs->Length = aLength;
     return STATUS_SUCCESS;
   };
  return STATUS_NAME_TOO_LONG;
};

Пробуем написать ее аналог, используя "дефайны"
Код

#define _Us_SetLength(_pus, _cbLen) ((_pus)->MaximumLength >= _cbLen) ?    \
((_pus)->Length = _cbLen) * 0 : STATUS_NAME_TOO_LONG


Какой из этих двух вариантов (если конечно они не содержат ошибок) предпочтительней для использования ?
(первый в три раза медленнее второго, но второй как-то ненадежно выглядит smile)
Например, в нем используется выражение " ((_pus)->Length = _cbLen) * 0 "
Всегда ли его левый сомножитель будет "вычисляться" или, при некоторых условиях, может игнорироваться ?
PM MAIL   Вверх
Alexeis
Дата 23.7.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Riply @  23.7.2008,  16:23 Найти цитируемый пост)
первый в три раза медленнее второго, но второй как-то ненадежно выглядит

  Мож под дебагом игнорируется директива __inline. 
  __inline однозначно предпочтительнее, так как там идет проверка типов на этапе компиляции и проч. Нужно попробовать дизассемблировать релизовый экзешник и сравнить код. Я думаю разницы не будет.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Riply
Дата 23.7.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



Цитата(Alexeis @  23.7.2008,  17:31 Найти цитируемый пост)
Мож под дебагом игнорируется директива __inline. 
  __inline однозначно предпочтительнее, так как там идет проверка типов на этапе компиляции и проч. Нужно попробовать дизассемблировать релизовый экзешник и сравнить код. Я думаю разницы не будет. 


Попробовала запустить не из под среды.
Результат тот же: соотношение один к трем.
Сейчас попробую посмотреть в CPU-шке, правда я там себя не очень уверенно чувствую smile

PM MAIL   Вверх
W4FhLF
Дата 23.7.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Выложи два варианта в виде exe в релиз сборке. Посмотрим на оптимизацию. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Partizan
Дата 23.7.2008, 17:58 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



ммм...насколько я знаю компилятор оставляет за собой право не инлайнить функцию по своему усмотрению даже тогда когда явно указан модификатор __inline...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Riply
Дата 23.7.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



Цитата(W4FhLF @  23.7.2008,  17:49 Найти цитируемый пост)
Выложи два варианта в виде exe в релиз сборке. Посмотрим на оптимизацию.


Сейчас, только переброшу это безобразие в пустой проект.
Да, на всякий случай: я под Builder`ом. Все равно выкладывать ?

PM MAIL   Вверх
W4FhLF
Дата 23.7.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

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



Цитата(Riply @  23.7.2008,  17:59 Найти цитируемый пост)
Да, на всякий случай: я под Builder`ом. Все равно выкладывать ?


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

Но, Partizan, скорее всего прав. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Riply
Дата 23.7.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



Цитата(W4FhLF @  23.7.2008,  18:01 Найти цитируемый пост)
Ну создай какой-нибудь тестовый проект


Хорошо, только мне надо чуть времени.

PM MAIL   Вверх
DRUID3
Дата 23.7.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Partizan @  23.7.2008,  16:58 Найти цитируемый пост)
ммм...насколько я знаю компилятор оставляет за собой право не инлайнить функцию по своему усмотрению даже тогда когда явно указан модификатор __inline... 

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

Цитата(Alexeis @  23.7.2008,  16:31 Найти цитируемый пост)

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

очень похоже, на недавний спор "что лучше указатель или ссылка". То, что написали в учебнике для создания первичных представлений - одно. То что следует применять в отдельном случае на практике - другое. define - 100% разменяет объем на скорость. Директива inline, да еще не к месту примененная так и останется директивой.


--------------------
Every time if you use Linux, you are joined to the communism...
практика - критерий истины ... отделенной от нас пропастью субъективного восприятия...
PM MAIL WWW Skype   Вверх
Riply
Дата 23.7.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



Цитата(DRUID3 @  23.7.2008,  18:05 Найти цитируемый пост)
Ага... Причем, реально inline должен работать только с указателями на внешние объекты не имя собственных переменных и ничего не возвращая. 


"ничего не возвращая" в смысле не может быть и функцией в том числе ?

P.S.
 Прикрепила файл.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Inline_Test.rar 185,10 Kb
PM MAIL   Вверх
DRUID3
Дата 23.7.2008, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Riply @  23.7.2008,  17:56 Найти цитируемый пост)
"ничего не возвращая" в смысле не может быть и функцией в том числе ?

void... а фнкцией она само собой быть не может. Это же подстановка. Вот как только появляется хоть один атрибут функции это уже не inline... 


--------------------
Every time if you use Linux, you are joined to the communism...
практика - критерий истины ... отделенной от нас пропастью субъективного восприятия...
PM MAIL WWW Skype   Вверх
Riply
Дата 23.7.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



Цитата(DRUID3 @  23.7.2008,  19:03 Найти цитируемый пост)
void... а фнкцией она само собой быть не может. Это же подстановка. Вот как только появляется хоть один атрибут функции это уже не inline...  


"Нда... Сказали мы с Петром Иванычем" (с) smile

Либо у меня еще и в Delphi пробелы с образованием, либо C++ это совсем не Delphi  smile

Добавлено через 5 минут и 9 секунд
P.S.
 А как насчет произведения, о котором я спрашивала в топике ?
 Всегда ли будет вычисляться левая часть ?
PM MAIL   Вверх
mes
Дата 23.7.2008, 20:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Riply @  23.7.2008,  17:23 Найти цитируемый пост)
Например, в нем используется выражение " ((_pus)->Length = _cbLen) * 0 "
Всегда ли его левый сомножитель будет "вычисляться" или, при некоторых условиях, может игнорироваться ?

насколько я понял вопрос такой: всегда ли будет происходить присваивание?  Да


Цитата(DRUID3 @  23.7.2008,  19:03 Найти цитируемый пост)
void... а фнкцией она само собой быть не может. Это же подстановка. Вот как только появляется хоть один атрибут функции это уже не inline...  


т.е функция  inline int max(int a, int b) { return (a>b)?  a: b; } не будет инлайниться? не согласен 



Это сообщение отредактировал(а) mes - 23.7.2008, 20:49


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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(mes @  23.7.2008,  19:48 Найти цитируемый пост)
т.е функция  inline int max(int a, int b) { return (a>b)?  a: b; } не будет инлайниться? не согласен 

  Мне тоже кажеться что должно работать. Возможно такое ограничение есть у одного из компиляторов. Насколько я помню есть ограничение на число машинных команд.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DRUID3
Дата 23.7.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Riply @  23.7.2008,  18:16 Найти цитируемый пост)
Либо у меня еще и в Delphi пробелы с образованием, либо C++ это совсем не Delphi 

Я не знаю Delphi, и не знаю что Вам на это сказать. Я имел ввиду, что нужно применить процедуры - ничего не возвращающие функции 
void fn_foo();
Цитата(Riply @  23.7.2008,  18:16 Найти цитируемый пост)
 А как насчет произведения, о котором я спрашивала в топике ?
 Всегда ли будет вычисляться левая часть ? 

Крайний левый операнд в тринарном выражении будет вычисляться всегда - он проверяется на "0". Если он ">0" то второй оператор, а иначе - третий. Если же Вы хотите узнать будет ли повторяться бессмысленное умножение на "0" то да, будет.

Цитата(mes @  23.7.2008,  19:48 Найти цитируемый пост)
т.е функция  inline int max(int a, int b) { return (a>b)?  a: b; } не будет инлайниться? не согласен 

А баба яга - протиФФ. smile  Я рассказал когда inline будет 100% inline во всех компиляторах. Некоторые случаи возможны и в более сложных ситуациях. Зависит от "ума" компилятора, и того к чему он преобразует внутри "себя любимого". Но, например, вообще нереализуем рекурсивный inline вызов. Столкнулся пару месяцев назад - чужой проект был "глубоко оптимизирован" - перед каждой функцией стояло inline. Я с ним долбался долго, а потом дай-ка думаю посношу это... и... и нифига не изменилось, блин! Поспрашивал на electronix? там сказали почитай Саттера. Почитал - полный бред ниочем, мол может оптимизировать? а может и не оптимизировать, смотря от урожая травы в Африке smile . И я блин вспомнил, читал де, что собственные закрытые функции класса компилер сам делает inline если они работают только с полями класса. Блин... Пришлось немного пошаманить, зато inline стали настоящими подстановками.

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

Добавлено @ 21:38
Цитата(Alexeis @  23.7.2008,  20:07 Найти цитируемый пост)
Мне тоже кажеться что должно работать. Возможно такое ограничение есть у одного из компиляторов. Насколько я помню есть ограничение на число машинных команд. 

Нет, реально ограничение на целесообразность подстановки. И ее "пик" это отсутствие собственных переменных и возврата. Хоть в C а хоть в C++. Работайте с полями глобальной структуры или делайте закрытые методы обращающиеся по указателю к полям объекта - будет вам счастье. А иначе мрак хаоса описанный в книжонке Саттера...

Это сообщение отредактировал(а) DRUID3 - 23.7.2008, 21:45


--------------------
Every time if you use Linux, you are joined to the communism...
практика - критерий истины ... отделенной от нас пропастью субъективного восприятия...
PM MAIL WWW Skype   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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