На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Win + VS. Заинлайнить функцию из семейства Interlocked...()
    Вопрос к знатокам VS.

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

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

    Например для InterlockedExchangePointer((void **)pp, p) получается такая портянка:
    ExpandedWrap disabled
      mov   esi, DWORD PTR __imp__InterlockedExchange@8
      push  eax
      push  edi
      call  esi

    вместо простого LOCK XCHG.
    (И внутри __imp__InterlockedExchange@8 ещё множество команд, а не одна инструкция).

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

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

    PPS: Подобное поведение наблюдаю как в VS2005 так и в VS2017, поэтому версию VS не указываю - видимо во всех это одинаково.
    Сообщение отредактировано: jcxz -
      На godbolt установлена MSVC 19.14 x64, там вот так выдает
      ExpandedWrap disabled
          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.
        Цитата
        На 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.
        Сообщение отредактировано: jcxz -
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0241 ]   [ 17 queries used ]   [ Generated: 29.03.24, 07:44 GMT ]