непонятки с intrinsic-функциями в msvs2005

Тема в разделе "WASM.WIN32", создана пользователем Avoidik, 17 янв 2007.

  1. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    пытаюсь создать минимальное приложение без CRT (/NODEFAULTLIB) и уже запарился искать ошибку, может я глючу, в чем проблема в этом коде, почему вылазиет 'unresolved external symbol', когда ZeroMemory (memset) является intrinsic-функцией, по сути она должна внедряться в код, на msvs < 2005 все компилится без проблем, гдееее моя ошибка? спасибо за помощь
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Avoidik
    'Enable intrinsic functions' разрешает, а не обязывает компилятор использовать intrinsic-варианты ф-ций. В данном случае он посчитал, что выгоднее использовать вызов CRT-шного memset, вероятно из-за большого размера буфера (библиотечный memset оптимизирован на SSEx).
    Попробуй поставить вместо sizeof(_TEST), скажем, 32.
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    надо поиск юзать http://www.wasm.ru/forum/viewtopic.php?id=16653
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    В последнем CRT используются интеловские реализации основных функций (ftol, alloca, strcpy и т.д.) и в МС слепо верят в непревзойдённость этих реализаций (судя по ответам разработчков компилятора на их официальном форуме, они сами даже не тестили новый CRT). Если у вас есть доступ на этот форум, можете полюбоваться:
    forums.microsoft.com/MSDN/ShowPost.aspx?PostID=125048&SiteID=1
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    да вроде форум не закрытый
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Asterix
    Меня однажды через российский прокси не пустили. Видать, наши флудеры там перед этим отметились :)
     
  7. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    мемсеты инлайнятся только если размер буфера известен и меньше четверти страницы.
    если не хочется вызовов CRT - компилим с ключем /Oi- и пишем все функции сами ручками и как inline
     
  8. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    блин как все плохо, придется откат делать на vs2003 :dntknw: а к примеру стандартные intrinsic-функции можно переопределить на свои как-нибудь?
     
  9. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Avoidik
    Почему плохо? Компилятор пытается сгенерировать более эффективный код, вот и всё.

    См. ответ Dr.Golova. Можно написать самому желаемые реализации таких ф-ций и сделать их inline (ну, или __forceinline) - эффект будет практически тот же, что и с intrinsic.
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Avoidik
    ты топик то по ссылке читал? Там и решение было..
    Да и проблема только с одной функцией memset
     
  11. Guest

    Guest Guest

    Публикаций:
    0
    Если надо минимальное приложение, поставь шэлл-код на поиск функций по хэщу, и юзай memset из MSVCRT.DLL. Могу дать пример шэлла.
     
  12. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    Asterix, да, я увидел
    im1111, мне CRT не нужен, в первом посте написано, да и загрузка по хешу у меня есть
     
  13. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    green
    Следующий код не инлайнится при любых настройках, хоть ты тресни:
    Код (Text):
    1. __forceinline __declspec(naked) void* __fastcall xalloca(int x){
    2.     __asm{
    3.         add ecx,3
    4.         pop edx
    5.         and ecx,-4
    6.         sub esp,ecx
    7.         mov eax,esp
    8.         jmp edx
    9.     }
    10. }
    И чем же вызов функции из внешней библиотеки эффективнее rep stosd?
     
  14. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia

    И чем же вызов функции из внешней библиотеки эффективнее rep stosd?


    вот и я о том же
     
  15. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    А почему нет? См. хотя бы optimization guide'ы...
     
  16. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Ustus
    По размеру rep stosd превзойти невозможно. По скорости можно, но не очень значительно и только на больших блоках памяти (см. А. Фога). Сам факт вызова кода из недр какой-то внешней DLL на скорости положительно сказаться не может. Поэтому испокон веков существует понятие inline (и производное от него "intrinsic").
     
  17. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    вот как раз для больших блоков (если заведомо известно что они большие), я юзаю свою функцию _memset с асмовыми вставками, а так и rep stosd хватает
     
  18. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Quantum
    naked ф-ции не инлайнятся. Для инлайна компилятору нужна свобода кодогенерации, которой он лишён для таких ф-ций.
    CRT-шный memset оптимизирован на MMX/SSE, что даёт существенный выигрыш на больших буферах по сравнению с stos, даже с учётом косвенного вызова.
     
  19. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    green
    "хоть ты тресни" подразумевает все возможные манипуляции с кодом. Без модификатора naked оно тоже не инлайнится.

    Компилятор генерирует вызовы CRT для всех memset'ов, включая маленькие, коих в любой программе обычно бывает гораздо больше чем больших. Поэтому в общем случае код получается на порядок менее оптимальным в плане скорости, чем в более старых версиях, на что постоянно жалуются разработчики (см. ссылку выше).
     
  20. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Да, в самом деле. Очевидно, та же проблема - ф-ции, с асм-вставками недостаточно гибкие для инлайна. Компилятор не умеет анализировать и модифицировать код вставок (да и права не имеет).
    У меня при длине блока <= 40 байт генерируется intrinsic memset (VS2005 SP1).