Майкрософт вводит в C++ ключевое слово __restrict (аналог restrict из С99).
То о чем так долго говорили большевики наконец-то свершилось.
Больше не нужно будет копировать массивы PODов memcpy явно.
Пример.
template <class T>
void Copy(T *__restrict dst,const T *__restrict src,size_t N)
{
for(; N ;N--,dst++,src++) *dst=*src;
}
void IntCopy(int *__restrict dst,const int *__restrict src,size_t N)
{
Copy(dst,src,N);
}
struct Test
{
int x;
int y;
int z;
};
void TestCopy(Test *__restrict dst,const Test *__restrict src,size_t N)
{
Copy(dst,src,N);
}
Разворачивается это как и должно в memcpy.
??$Copy@H@@YAXPIAHPIBHI@Z PROC ; Copy<int>, COMDAT
; 51 : for(; N ;N--,dst++,src++) *dst=*src;
mov ecx, DWORD PTR _N$[esp-4]
test ecx, ecx
je SHORT $LN3@Copy
push esi
mov esi, DWORD PTR _src$[esp]
push edi
mov edi, DWORD PTR _dst$[esp+4]
rep movsd
pop edi
pop esi
$LN3@Copy:
; 52 : }
ret 0
??$Copy@H@@YAXPIAHPIBHI@Z ENDP ; Copy<int>
??$Copy@UTest@@@@YAXPIAUTest@@PIBU0@I@Z PROC ; Copy<Test>, COMDAT
; 51 : for(; N ;N--,dst++,src++) *dst=*src;
mov eax, DWORD PTR _N$[esp-4]
test eax, eax
je SHORT $LN3@Copy@2
push esi
mov esi, DWORD PTR _src$[esp]
lea ecx, DWORD PTR [eax+eax*2]
add ecx, ecx
push edi
mov edi, DWORD PTR _dst$[esp+4]
add ecx, ecx
shr ecx, 2
rep movsd
pop edi
pop esi
$LN3@Copy@2:
; 52 : }
ret 0
??$Copy@UTest@@@@YAXPIAUTest@@PIBU0@I@Z ENDP ; Copy<Test>
On Mon, 10 Oct 2005 20:04:51 +0400, Шахтер <23118@users.rsdn.ru> wrote:
> Майкрософт вводит в C++ ключевое слово __restrict (аналог restrict из С99).
> То о чем так долго говорили большевики наконец-то свершилось.
> Больше не нужно будет копировать массивы PODов memcpy явно.
> Пример.
[]
Не факт, что rep movsd быстрее чем обычный цикл:
.L10:
mov %eax, DWORD PTR [%edx]
mov DWORD PTR [%ecx], %eax
add %ecx, 4
add %edx, 4
inc %ebx
cmp %edi, %ebx
jne .L10
--
Maxim YegorushkinPosted via RSDN NNTP Server 1.9
Здравствуйте, MaximE, Вы писали:
ME>On Mon, 10 Oct 2005 20:04:51 +0400, Шахтер <23118@users.rsdn.ru> wrote:
>> Майкрософт вводит в C++ ключевое слово __restrict (аналог restrict из С99).
>> То о чем так долго говорили большевики наконец-то свершилось.
>> Больше не нужно будет копировать массивы PODов memcpy явно.
>> Пример.
ME>[]
ME>Не факт, что rep movsd быстрее чем обычный цикл:
ME>ME>.L10:
ME> mov %eax, DWORD PTR [%edx]
ME> mov DWORD PTR [%ecx], %eax
ME> add %ecx, 4
ME> add %edx, 4
ME> inc %ebx
ME> cmp %edi, %ebx
ME> jne .L10
ME>
ME>--
ME>Maxim Yegorushkin
Это уже фича оптимизатора -- в Майкрософт считают, что memcpy надо инлайнить в rep movsd. Наверно, у них есть для этого какие-то основания.
Здравствуйте, MaximE, Вы писали:
ME>Не факт, что rep movsd быстрее чем обычный цикл:
ME>ME>.L10:
ME> mov %eax, DWORD PTR [%edx]
ME> mov DWORD PTR [%ecx], %eax
ME> add %ecx, 4
ME> add %edx, 4
ME> inc %ebx
ME> cmp %edi, %ebx
ME> jne .L10
Для P4 — факт, там аппаратно ускорено. Для других процессоров
здесь (подобные алгоритмы применяются в некоторых быстрых библиотечных memcpy, например в intel C++).
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth