Как мне сделать что-то вроде memcpy в D - PullRequest
7 голосов
/ 02 сентября 2011

У меня есть место в памяти a, и я хочу быстро скопировать определенное количество байтов в другое место, как бы я это сделал в 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);
}

Спасибо!Рул

Ответы [ 2 ]

12 голосов
/ 02 сентября 2011

При назначении слайсу будет выполнена копия массива, которая вызывает внутреннюю память 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;
}
8 голосов
/ 02 сентября 2011

Обратите внимание, что у вас также есть доступ к C memcpy в D. D может напрямую обращаться ко всей стандартной библиотеке C.

...