Te sorprenderías, ¡pero el compilador a menudo convierte tu ciclo de copia básico en memcpy por sí solo!
Ver la prueba:
rep ~ $ cat aa.cpp
#include
usando el espacio de nombres estándar;
int main ()
{
int buf [60000], buf2 [60000];
para (int i = 0; i <60000; ++ i) buf2 [i] = buf [i];
- Si quiero resolver problemas del mundo real, ¿qué debo hacer, encontrar esos problemas y luego aprender las estructuras de datos y algoritmos requeridos o viceversa?
- ¿Cuáles son los requisitos previos para Introducción a los algoritmos de Thomas Cormen?
- ¿Se puede resolver un cubo de Rubik sin sus algoritmos?
- ¿Cómo podemos verificar si un punto (digamos el origen) se encuentra en un casco convexo 6-D (o ND) y qué tan lejos está el punto de cualquiera de los lados (facetas) del casco convexo?
- Cómo resolver esto usando programación dinámica
// Todo el código a continuación es simplemente una forma complicada de engañar al compilador en
// generar código en lugar de optimizar todo
// Tenemos que usar tanto buf1 como buf2 y algunos cálculos que
// el compilador no puede razonar y convertirlo en una constante
int k = 0;
para (int i = 0; i <60000; ++ i) buf [i] = i * buf [i];
para (int i = 0; i <60000; ++ i) k + = buf [i] + buf2 [i];
cout << k << endl;
}
El ensamblador se ve así:
rep ~ $ g ++ -O3 -S aa.cpp
rep ~ $ cat aa.s
.archivo “aa.cpp”
.section .text.un probable, “ax”, @ progbits
.LCOLDB2:
.section .text.startup, “ax”, @ progbits
.LHOTB2:
.p2align 4,, 15
.globl principal
.type main, @function
principal:
.LFB1024:
.cfi_startproc
subq $ 480008,% rsp
.cfi_def_cfa_offset 480016
movl $ 240000,% edx
leaq 240000 (% rsp),% rdi
movq% rsp,% rsi
llamar a memcpy
movdqa .LC1 (% rip),% xmm4
leaq 240000 (% rsp),% rdx
movq% rsp,% rax
movdqa .LC0 (% rip),% xmm3
…recorte…..
¿Mira eso?
Redujo un bucle en una memcpy ()
Los compiladores son muy inteligentes: a menos que seas un genio, nunca hay uso de hipotéticas micro optimizaciones.
Desde un punto de vista de legibilidad, es mejor llamar a funciones que escribir bucles, así que use std :: copy o std :: fill o lo que sea.