Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.141.193.158] |
|
Сообщ.
#1
,
|
|
|
Вопрос к знатокам VS.
Компилирую под VS код для x86. Под винду. В коде есть множество вызовов Interlocked-функций. И почему-то даже в режиме максимальной оптимизации компилятор не заменяет такие функции на соответствующие им инструкции процессора. А оформляет полновесный вызов функций через таблицу импорта. Да ещё и с передачей аргументов через стек! В результате, вместо одной команды, получается довольно длинная цепочка кода. Например для InterlockedExchangePointer((void **)pp, p) получается такая портянка: mov esi, DWORD PTR __imp__InterlockedExchange@8 push eax push edi call esi вместо простого LOCK XCHG. (И внутри __imp__InterlockedExchange@8 ещё множество команд, а не одна инструкция). Что надо указать VS, чтобы он инлайнил такие функции в одну команду? PS: Прошу - не нужно разводить холиваров на тему "В нонешние времена это всё крохи на фоне быстродействия современных CPU". Я сам всё это прекрасно знаю. Но.... душа требует красоты и возмущается таким непотребством в коде. PPS: Подобное поведение наблюдаю как в VS2005 так и в VS2017, поэтому версию VS не указываю - видимо во всех это одинаково. |
Сообщ.
#2
,
|
|
|
На godbolt установлена MSVC 19.14 x64, там вот так выдает
mov rax, QWORD PTR T$[rsp] mov rcx, QWORD PTR P$[rsp] xchg QWORD PTR [rcx], rax И вдогонку: Цитата Intel® 64 and IA-32 Architectures Software Developer’s Manual: If a memory operand is referenced, the processor’s locking protocol is automatically implemented for the duration of the exchange operation, regardless of the presence or absence of the LOCK prefix or of the value of the IOPL. |
Сообщ.
#3
,
|
|
|
Цитата На godbolt установлена MSVC 19.14 x64, там вот так выдает Я не совсем Вас понял. Где установлена? И это 64-битное приложение. У меня - 32-битное. Компилю VS2005 и VS2017 как 32-битное приложение. Прошерстил ключики в свойствах проекта - не нашёл ничего подходящего. Хотя в хидерах (WinBase.h + winnt.h) нахожу упоминания про _InterlockedExchange() да и в ms-хелпе пишут "This function is implemented using a compiler intrinsic where possible". Только почему-то для моего проекта оно оказывается impossible. PS: Про префикс LOCK для XCHG - понятно, даже что-то такое припоминается из мануала по инструкциям CPU. |