Раньше я всегда компилировал драйвера в XP DDK. Его компилятор всегда превращает memcpy в rep movsd/movsb. Вчера я поставил WDK, там более новая версия компилятора, и столкнулся с неприятной проблемой - функции memcpy и memset всегда вызываются через импорт, что раздувает код и мешает его работе в базонезависимом модуле. http://msdn2.microsoft.com/en-us/library/ms864585.aspx Здесь написано, что заставить инлайнить эти функции можно директивой #pragma intrinsic, но она решает проблему лишь отчасти. При укзании в memcpy фиксированого размера в последнем параметре, вставляется rep movsd, ну а если размер задается переменной, то по прежнему вызывается внешняя функция. Откатываться к старому компилятору из за этого очень не хочеться, может кто нибудь подскажет, как решить проблему?
написать функции самому inline void memcpy( void* dst, void* src, size_t len ) { __asm { mov esi, src mov edi, dst mov ecx, len rep movsb } } примерно так. или вообще в виде макроса
Такой вариант работает, да только инлайн получается не очень компактным, хуже чем делал старый компилятор. Да и при обнулении структур наподобии CHAR dll_name[MAX_PATH] = {0}; всеравно вставляется внешний вызов.
А самому сказать компилятору, чтобы использовал intrinsic? #if (_MSC_FULL_VER > 13009037) #pragma intrinsic (_memcpy) #endif PS: Так кстати оптимизируются и Interlock операции
действительно, извини. можешь попробовать включить /Ob<n> inline expansion (default n=0), также поиграться со стек гуардом, его тоже добавили в новых компиляторах. вот ещё статейка неплохая Криса Касперского, как раз по этой функции: http://www.insidepro.com/kk/024/024r.shtml
Оказалось что проблема решается очень просто, достаточно определить Код (Text): #define memcpy __movsb #define memset __stosb __movsb и __stosb это встроеные функции vc, генерирующие rep movsb/rep stosb, и при этом достигается лучшая оптимизация, чем при асм вставке (за счет оптимального перераспределения регистров в функции).