【问题标题】:How do I do something like a memcpy in D我如何在 D 中执行类似 memcpy 的操作
【发布时间】:2011-09-02 09:16:48
【问题描述】:

我有一个内存位置 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);
}

谢谢! 罗尔

【问题讨论】:

  • 对于最后一种情况,即使在 C 中也不应使用 memcpy,除非您 100% 确定指向的内存具有与编译器用于结构布局相同的填充和对齐方式。这是非常不便携的!
  • 是的,你是对的,但我想知道的是如何从理论上在 D 中进行这种内存操作。我知道不同编译器的对齐方式是如何工作的。

标签: performance memory d


【解决方案1】:

分配给切片会执行数组复制,内部调用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】:

请注意,您还可以访问 D 中的 C 的 memcpy。D 可以直接访问 C 的整个标准库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多