2011-09-02 99 views
6

我有一個內存位置a,我想將一定數量的字節快速複製到另一個位置,我該如何在D中執行此操作?如何在D中執行類似於memcpy的操作D

例如我會怎麼做這:

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

而且如何將填補快一個結構:

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

謝謝! Roel

+1

對於最後一種情況,即使在C中也不應該使用memcpy,除非您100%確定指向的內存具有與編譯器用於結構佈局相同的填充和對齊方式。這是非常不便攜的! – harald

+1

是的,你是對的,但我想知道的是如何在D理論上做這種內存操作。我知道如何在不同的編譯器上工作。 –

回答

11

指定給切片將執行數組副本,該數組副本在內部調用memcpy。


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

對於第二個:


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

謝謝,正是我需要的!是的,我會成爲一個好孩子,而不是使用未對齊的內存:-) –

7

請注意,您還可以訪問到C的memcpy在D d可以直接訪問C'S整個標準庫。

相關問題