Перейти к содержанию
    

Win + VS. Заинлайнить функцию из семейства Interlocked...()

Вопрос к знатокам VS.

Компилирую под VS код для x86. Под винду. В коде есть множество Interlocked-функций. И почему-то даже в режиме максимальной оптимизации компилятор не заменяет такие функции на соответствующие им инструкции процессора. А оформляет полновесный вызов функций через таблицу импорта. Да ещё и с передачей аргументов через стек! :cray2:

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

Например для InterlockedExchangePointer((void **)pp, p) получается такая портянка:

mov   esi, DWORD PTR __imp__InterlockedExchange@8
push  eax
push  edi
call  esi

вместо простого LOCK XCHG.

Что надо указать VS, чтобы он инлайнил такие функции в одну команду?

 

PS: Прошу - не нужно разводить холиваров на тему "В нонешние времени это всё крохи на фоне быстродействия современных CPU". Я сам всё это прекрасно знаю. Но.... душа требует красоты и возмущается таким непотребством в коде.  :wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Оно не может инлайнть то что в dll находится. Imp  в начале видите? Посмотрите описание этой функции и увидите что ей надо чтобы стать инлайном.

Ps: хорошо бы указывать версию студии, версию  sdk/ddk с которыми работаете.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

30 минут назад, GenaSPB сказал:

Оно не может инлайнть то что в dll находится. Imp  в начале видите?

Я знаю что такое таблица импорта, писал об этом в исходном вопросе.

Цитата

Посмотрите описание этой функции и увидите что ей надо чтобы стать инлайном.

В доках MS указано: This function is implemented using a compiler intrinsic where possible.

Т.е. - она может быть intrinsic-ом, вне зависимости от Imp. В свойствах проекта у меня установлена галка "разрешить использовать intrinsic функции".

Заменить на _InterlockedExchangePointer()  - тоже не помогает.

Цитата

Ps: хорошо бы указывать версию студии, версию  sdk/ddk с которыми работаете.  

VS2005 и VS2017.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Release/debug?

Еще раз. Из хедера сюда ееописаеее со всеми обпамлениями

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 часов назад, GenaSPB сказал:

Release/debug?

19 часов назад, jcxz сказал:

И почему-то даже в режиме максимальной оптимизации

Цитата

Еще раз. Из хедера сюда ееописаеее со всеми обпамлениями

Выложить сюда WinBase.h + winnt.h общим объёмом ~1МБ?  С запутанной структурой условной компиляции, с зависимостями от разных дефайнов?

Так сами можете открыть и посмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не предлагаю выкладывать а самому вокруг этой функции посмоореть.

Ок. Хотя бы уточните вы аппликейшн делаете или драйвер....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да я уже смотрел конечно. Ещё до того как тему создал. Там такой лес и множества условных включений/выключений, что чёрт ногу сломит. Но по-крайней мере в некоторых строчках я вижу подобное:

#define InterlockedExchange _InterlockedExchange

где с префиксным '_' - как раз желаемый intrinsic. Но видимо ключики компиляции так установлены, что он не используется. Явное использование _InterlockedExchange вместо InterlockedExchange приводит к ошибке компиляции "имя не определено".

Делаю приложение.

 

PS: На просторах инета есть сообщения, что у других людей оно инлайнится. Да и память вроде подсказывает, что раньше я у себя тоже видел заинлайненный вариант (возможно не в VS, а в билдере).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну залез... промотал пару сотен строк наверх
Инлайн подставляется если 
_M_AMD64 и _AMD64_

или

_M_IA64

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...