2011-09-02 6 views
6

私はメモリ位置を持っていて、別の場所にある量のバイトを速くコピーしたいのですが、どのように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

最後のケースでは、コンパイラが構造体レイアウトに使用するのと同じパディングとアラインメントを持つメモリが100%確実でない限り、Cでもmemcpyは使用しないでください。これは非常に移植性がありません! – harald

+1

はい、あなたは正しいですが、私が見つけようとしているのは、Dのこの種のメモリ操作を理論的に行う方法です。私は異なるコンパイラのアライメントがどのように機能するかについて知っています。 –

答えて

11

スライスに割り当てると、内部的にmemcpyを呼び出す配列コピーが実行されます。 1秒間


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

:あなたはまた、直接Cの全体の標準ライブラリにアクセスすることができますD. DでCのmemcpyへのアクセス権を持っている


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

ありがとう、ちょうど私が必要なもの!そして、はい、私は良い男の子になり、整列していないメモリを使用しません:-) –

関連する問題