http://www.rsdn.ru/forum/cpp/2896818.flat.aspxАвтор: stab
Дата: 31.03.08
пример по ссылке с memcpy впринципе неверный код генерируется одинаковый
// mode:release -O2 -Ot msvc 2008
__declspec(noinline)
void me(char* /*__restrict*/ dest, char const* /*__restrict*/ source, size_t count)
{
00401080 56 push esi
00401081 8B F2 mov esi,edx
while(count--)
00401083 85 C0 test eax,eax
00401085 74 0B je me+12h (401092h)
{
*dest-- = *source--;
00401087 8A 16 mov dl,byte ptr [esi]
00401089 48 dec eax
0040108A 88 11 mov byte ptr [ecx],dl
0040108C 49 dec ecx
0040108D 4E dec esi
0040108E 85 C0 test eax,eax
00401090 75 F5 jne me+7 (401087h)
00401092 5E pop esi
}
}
00401093 C3 ret
------------------------------------------------------------------------------------------------
__declspec(noinline)
void me(char* __restrict dest, char const* __restrict source, size_t count)
{
00401080 56 push esi
00401081 8B F2 mov esi,edx
while(count--)
00401083 85 C0 test eax,eax
00401085 74 0B je me+12h (401092h)
{
*dest-- = *source--;
00401087 8A 16 mov dl,byte ptr [esi]
00401089 48 dec eax
0040108A 88 11 mov byte ptr [ecx],dl
0040108C 49 dec ecx
0040108D 4E dec esi
0040108E 85 C0 test eax,eax
00401090 75 F5 jne me+7 (401087h)
00401092 5E pop esi
}
}
00401093 C3 ret
------------------------------------------------------------------------------------------------
а вот пример где __restrict и правда рулит
__declspec(noinline)
int hh(int * /* __restrict */ a, int * /* __restrict */ b)
{
*a = 5;
004010A0 C7 00 05 00 00 00 mov dword ptr [eax],5
*b = 7;
004010A6 C7 01 07 00 00 00 mov dword ptr [ecx],7
return *a+*b;
004010AC 8B 00 mov eax,dword ptr [eax]
004010AE 83 C0 07 add eax,7
}
004010B1 C3 ret
------------------------------------------------------------------------------------------------
__declspec(noinline)
int hh(int * __restrict a, int * __restrict b)
{
*a = 5;
004010A0 C7 00 05 00 00 00 mov dword ptr [eax],5
*b = 7;
004010A6 C7 01 07 00 00 00 mov dword ptr [ecx],7
return *a+*b;
004010AC B8 0C 00 00 00 mov eax,0Ch
}
004010B1 C3 ret
------------------------------------------------------------------------------------------------
код драйвера
int main() {
char * volatile p1 = 0;
int * volatile p2 = 0;
hh(p2, p2);
me(p1, p1, printf("jkkljkl"));
}
да и глядя на такой код
*dest++/-- = *source++/--;
зачем тут нужен LHS (load-hit-store) впринципе ?