memcpy の次の実装を見つけました (インタビューの質問、反復回数 ~ サイズ/4):
void memcpy(void* dest, void* src, int size)
{
uint8_t *pdest = (uint8_t*) dest;
uint8_t *psrc = (uint8_t*) src;
int loops = (size / sizeof(uint32_t));
for(int index = 0; index < loops; ++index)
{
*((uint32_t*)pdest) = *((uint32_t*)psrc);
pdest += sizeof(uint32_t);
psrc += sizeof(uint32_t);
}
loops = (size % sizeof(uint32_t));
for (int index = 0; index < loops; ++index)
{
*pdest = *psrc;
++pdest;
++psrc;
}
}
そして、私はそれを理解しているかどうかわかりません.....:
1) なぜ定義uint8_t *pdest,uint8_t *psrc
し、その後にキャストするのかuint32_t
-
*((uint32_t*)pdest) = *((uint32_t*)psrc);
最初から uint32_t として定義する必要があると思いpdest
ますpsrc
...何が欠けていますか? 2) この実装には問題があるように見えます: if src = 0x100
anddst = 0x104
および src (元の) はそのように見えます:
-------------------------
| 6 | 8 | 7 | 1 |
-------------------------
0x100 0x104 0x108 0x1C0
実行後はそのようになります
-------------------------
| 6 | 6 | 6 | 6 |.....
-------------------------
0x100 0x104 0x108 0x1C0
それにもかかわらず、次のメモリレイアウトが結果になるはずです
-------------------------
| 6 | 6 | 8 | 7 |....
-------------------------
0x100 0x104 0x108 0x1C0