__restrict
От: jyuyjiyuijyu  
Дата: 30.10.11 22:13
Оценка:
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) впринципе ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.