jcxz 234 21 июня, 2020 Опубликовано 21 июня, 2020 · Жалоба Вопрос к знатокам VS. Компилирую под VS код для x86. Под винду. В коде есть множество Interlocked-функций. И почему-то даже в режиме максимальной оптимизации компилятор не заменяет такие функции на соответствующие им инструкции процессора. А оформляет полновесный вызов функций через таблицу импорта. Да ещё и с передачей аргументов через стек! В результате, вместо одной команды, получается довольно длинная цепочка кода. Например для InterlockedExchangePointer((void **)pp, p) получается такая портянка: mov esi, DWORD PTR __imp__InterlockedExchange@8 push eax push edi call esi вместо простого LOCK XCHG. Что надо указать VS, чтобы он инлайнил такие функции в одну команду? PS: Прошу - не нужно разводить холиваров на тему "В нонешние времени это всё крохи на фоне быстродействия современных CPU". Я сам всё это прекрасно знаю. Но.... душа требует красоты и возмущается таким непотребством в коде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 21 июня, 2020 Опубликовано 21 июня, 2020 · Жалоба Оно не может инлайнть то что в dll находится. Imp в начале видите? Посмотрите описание этой функции и увидите что ей надо чтобы стать инлайном. Ps: хорошо бы указывать версию студии, версию sdk/ddk с которыми работаете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 21 июня, 2020 Опубликовано 21 июня, 2020 · Жалоба 30 минут назад, GenaSPB сказал: Оно не может инлайнть то что в dll находится. Imp в начале видите? Я знаю что такое таблица импорта, писал об этом в исходном вопросе. Цитата Посмотрите описание этой функции и увидите что ей надо чтобы стать инлайном. В доках MS указано: This function is implemented using a compiler intrinsic where possible. Т.е. - она может быть intrinsic-ом, вне зависимости от Imp. В свойствах проекта у меня установлена галка "разрешить использовать intrinsic функции". Заменить на _InterlockedExchangePointer() - тоже не помогает. Цитата Ps: хорошо бы указывать версию студии, версию sdk/ddk с которыми работаете. VS2005 и VS2017. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 21 июня, 2020 Опубликовано 21 июня, 2020 · Жалоба Release/debug? Еще раз. Из хедера сюда ееописаеее со всеми обпамлениями Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 22 июня, 2020 Опубликовано 22 июня, 2020 · Жалоба 15 часов назад, GenaSPB сказал: Release/debug? 19 часов назад, jcxz сказал: И почему-то даже в режиме максимальной оптимизации Цитата Еще раз. Из хедера сюда ееописаеее со всеми обпамлениями Выложить сюда WinBase.h + winnt.h общим объёмом ~1МБ? С запутанной структурой условной компиляции, с зависимостями от разных дефайнов? Так сами можете открыть и посмотреть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 22 июня, 2020 Опубликовано 22 июня, 2020 · Жалоба Не предлагаю выкладывать а самому вокруг этой функции посмоореть. Ок. Хотя бы уточните вы аппликейшн делаете или драйвер.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 22 июня, 2020 Опубликовано 22 июня, 2020 · Жалоба Да я уже смотрел конечно. Ещё до того как тему создал. Там такой лес и множества условных включений/выключений, что чёрт ногу сломит. Но по-крайней мере в некоторых строчках я вижу подобное: #define InterlockedExchange _InterlockedExchange где с префиксным '_' - как раз желаемый intrinsic. Но видимо ключики компиляции так установлены, что он не используется. Явное использование _InterlockedExchange вместо InterlockedExchange приводит к ошибке компиляции "имя не определено". Делаю приложение. PS: На просторах инета есть сообщения, что у других людей оно инлайнится. Да и память вроде подсказывает, что раньше я у себя тоже видел заинлайненный вариант (возможно не в VS, а в билдере). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 22 июня, 2020 Опубликовано 22 июня, 2020 · Жалоба Ну залез... промотал пару сотен строк наверх Инлайн подставляется если _M_AMD64 и _AMD64_ или _M_IA64 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться