2011-09-02 8 views
6

Tengo una ubicación de memoria y quiero copiar una cierta cantidad de bytes a otra ubicación rápidamente, ¿cómo haré esto en D?¿Cómo hago algo así como una memcpy en D

Por ejemplo ¿cómo voy a hacer esto:

int main() 
{ 
    void* src_data = 0x40001255; 
    void* dst_data = 0x47F22000; 
    u32 size = 0x200; 
    memcpy(dst_data, src_data, size); 
} 

También cómo llenaría una estructura rápida:

struct data_struct 
{ 
    u32 block1; 
    u32 block2; 
    u32 block3; 
    u32 block4; 
    u32 block5; 
    u62 block6; 
    u128 bigblock; 
} data_struct_t; 

int main() 
{ 
    void* src_data = 0x40001255; 
    struct data_struct_t dst_data; 
    u32 size = sizeof(data_struct); 
    memcpy(dst_data, src_data, size); 
} 

Gracias! Roel

+1

Para el último caso, no debe usar memcpy incluso en C, a menos que esté 100% seguro de que la memoria señalada tiene el mismo relleno y alineación que el compilador utiliza para el diseño de la estructura. ¡Esto es muy no portátil! – harald

+1

Sí, tiene razón, pero lo que estoy tratando de averiguar es cómo hacer este tipo de operaciones de memoria en D teóricamente. Sé cómo funciona la alineación en diferentes compiladores. –

Respuesta

11

Asignando a un corte se realizará una copia de la matriz, que llama a memcpy internamente.


void main() 
{ 
    void* src_data = 0x40001255; 
    void* dst_data = 0x47F22000; 
    uint size = 0x200; 
    dst_data[0..size] = src_data[0..size]; 
} 

Para la segunda:


struct data_struct 
{ 
    uint block1, block2, block3, block4, block5; 
    ulong block6; 
    uint[4] bigblock; 
} 

void main() 
{ 
    auto src_data = cast(data_struct*) 0x40001255; // unaligned, WTF?! 
    auto dst_data = *src_data; 
} 
+2

¡Gracias, exactamente lo que necesitaba! Y sí, seré un buen chico y no usaré memoria desalineada :-) –

7

en cuenta que también tiene acceso a C de memcpy en D. D puede acceder directamente a toda la biblioteca estándar de C.

Cuestiones relacionadas