2011-09-02 10 views
6

Ho una locazione di memoria a e voglio copiare una certa quantità di byte in un'altra posizione velocemente, come farei in D?Come faccio a fare qualcosa come una memcpy in D

Per esempio come faccio a fare questo:

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

anche come colmerebbe una struct veloce:

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); 
} 

Grazie! Roel

+1

Per l'ultimo caso non si dovrebbe usare memcpy anche in C, a meno che non si sia certi al 100% che la memoria puntata abbia lo stesso riempimento e allineamento che il compilatore usa per il layout della struct. Questo è molto non portatile! – harald

+1

Sì, sei corretto ma quello che sto cercando di scoprire è come fare questo tipo di operazioni di memoria in D in teoria. So come funziona l'allineamento su diversi compilatori. –

risposta

11

L'assegnazione a una sezione consente di eseguire una copia dell'array, che chiama memcpy internamente.


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

Per la seconda:


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

Grazie, esattamente quello di cui avevo bisogno! E sì, sarò un bravo ragazzo e non uso la memoria non allineata :-) –

7

noti che si hanno anche accesso alla C di memcpy in D. D può accedere direttamente tutta la libreria standard di C.

Problemi correlati