Re[10]: Что отрабоатает быстрее?
От: Шахтер Интернет  
Дата: 11.05.05 00:36
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Здравствуйте, Шахтер, Вы писали:


Ш>>...Нет. Цикл выполнит последовательность присваиваний

Ш>>
Ш>>dst[0] = src[0] ;
Ш>>dst[1] = src[1] ;
Ш>>dst[2] = src[2] ;
Ш>>dst[3] = src[3] ;
Ш>>...
Ш>>dst[size-1] = src[size-1] ;
Ш>>

Ш>>Что сделает memcpy -- всё что угодно, вплоть до форматирования винчестера. ...

AD>С этим я, пожалуй, соглашусь

AD>Но с другой стороны: vc оптимизирует цикл и memcpy в одинаковый код...

Разве?

; 11   :   char mem[10]={'a','b'};

    mov    al, 97                    ; 00000061H
    push    esi
    xor    edx, edx
    mov    DWORD PTR _mem$[esp+18], edx
    mov    cl, 98                    ; 00000062H
    mov    DWORD PTR _mem$[esp+22], edx
    push    edi
    mov    BYTE PTR _mem$[esp+20], al

; 12   :   
; 13   :   char *dst=mem+2;
; 14   :   const char *src=mem;
; 15   :   size_t size=8;
; 16   : 
; 17   : #if 1
; 18   :   
; 19   :   for(size_t i=0; i<size ;i++) dst[i]=src[i];

    mov    BYTE PTR _mem$[esp+22], al
    mov    BYTE PTR _mem$[esp+24], al
    mov    BYTE PTR _mem$[esp+26], al
    mov    BYTE PTR _mem$[esp+28], al

; 20   :   
; 21   : #else
; 22   : 
; 23   :   memcpy(dst,src,size);
; 24   : 
; 25   : #endif  
; 26   :   
; 27   :   cout.write(mem,10) << endl ;

    push    10                    ; 0000000aH
    lea    eax, DWORD PTR _mem$[esp+24]
    mov    BYTE PTR _mem$[esp+25], cl
    mov    BYTE PTR _mem$[esp+27], cl
    mov    BYTE PTR _mem$[esp+29], cl
    mov    BYTE PTR _mem$[esp+31], cl
    mov    BYTE PTR _mem$[esp+33], cl


; 11   :   char mem[10]={'a','b'};

    xor    eax, eax
    mov    DWORD PTR _mem$[esp+14], eax
    push    esi
    mov    BYTE PTR _mem$[esp+16], 97        ; 00000061H
    mov    BYTE PTR _mem$[esp+17], 98        ; 00000062H

; 12   :   
; 13   :   char *dst=mem+2;
; 14   :   const char *src=mem;
; 15   :   size_t size=8;
; 16   : 
; 17   : #if 0
; 18   :   
; 19   :   for(size_t i=0; i<size ;i++) dst[i]=src[i];
; 20   :   
; 21   : #else
; 22   : 
; 23   :   memcpy(dst,src,size);

    mov    ecx, DWORD PTR _mem$[esp+16]
    mov    DWORD PTR _mem$[esp+22], eax
    mov    DWORD PTR _mem$[esp+18], ecx
    mov    edx, DWORD PTR _mem$[esp+20]

; 24   : 
; 25   : #endif  
; 26   :   
; 27   :   cout.write(mem,10) << endl ;

    push    10                    ; 0000000aH
    lea    eax, DWORD PTR _mem$[esp+20]
    push    eax
    mov    ecx, OFFSET FLAT:?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
    mov    DWORD PTR _mem$[esp+30], edx
... << RSDN@Home 1.1.3 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.