memcpy多字节字节赋值问题

来源:计算机等级考试    发布时间:2012-08-29    计算机等级考试视频    评论

  以前没注意过多字节赋值问题,考虑的角度是充分利用 cpu 的 32 位带宽。一次复制 1 个字节和一次复制 4 个字节占用的 cpu 指令周期是一样的,既然我们的 cpu 能同时操作 32 位,为什么我们不能一次复制 4 个字节呢?如此一来,总运行的指令数将降低到原来的 1/4 !

  于是有下面代码:

  1 void *memcpy(void *dest, void *src, size_t count)

  2 {

  3     size_t c = count >> 2; /* 相当于 count / 4 */

  4     long *pt;

  5     const long *ps;

  6     if (c)

  7     {

  8         /* 首先按 4 个字节复制 */

  9         pt = (long *) dest;

  10         ps = (const long *) src;

  11         while (c)

  12         {

  13             *pt = *ps;

  14             pt++;

  15             ps++;

  16             c--;

  17         }

  18     }

  19     c = count & 3; /* 得到 count 模 4 的余数 */

  20     if (c)

  21     {

  22         /* 如果有剩下的,再按 1 个字节复制剩余的 */

  23         char *pct = (char *) pt;

  24         const char *pcs = (const char *) ps;

  25         while (c)

  26         {

  27             *pct = *pcs;

  28             pct++;

  29             pcs++;

  30             c--;

  31         }

  32     }

  33     return dest;

  34 }

  通过使用 long 型指针,强行按 4 个字节复制。

  还有对 3 种 memcpy 实现的对比,上述算法受到地址对齐的影响较为严重。在地址按4 字节对齐的时候,上述算法的效率比单字节 memcpy 实现高很多,但如果地址没有按4 字节对齐,则其效率并不高,有时甚至还比普通 memcpy 还低。这可能是因为,虽然上述算法减少了 cpu 的指令数,但内存的速度比 cpu 慢得多,速度的瓶颈还是在内存。

  编辑特别推荐:

  C++constconst_cast行为分析

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答