我需要将 6 字节整数值复制到内存区域中,从其开头开始并尽可能快地复制。如果硬件支持这样的操作,我想使用它(我现在使用的是 x64 处理器,编译器是 GCC 4.6.3)。
The memset
不适合这项工作,因为它只能复制字节。这std::fill
也不好,因为我什至无法定义迭代器,在内存区域的 6 个字节宽度位置之间跳转。
所以,我想要一个功能:
void myMemset(void* ptr, uint64_t value, uint8_t width, size_t num)
这看起来像memset
,但还有一个额外的参数width
定义多少bytes来自value
复制。如果类似的东西可以用 C++ 来表达,那就更好了。
我已经知道显而易见的事情myMemset
实施,这将调用memcpy
在循环中,最后一个参数(要复制的字节)等于width
。我还知道,我可以定义一个大小为的临时内存区域6 * 8 = 48
bytes,用6字节整数填充,然后memcpy
到目的地区域。
我们可以做得更好吗?
沿着的东西@马克·兰塞姆 https://stackoverflow.com/users/5987/mark-ransom评论:
复制 6 个字节,然后复制 6、12、24、48、96 等。
void memcpy6(void *dest, const void *src, size_t n /* number of 6 byte blocks */) {
if (n-- == 0) {
return;
}
memcpy(dest, src, 6);
size_t width = 1;
while (n >= width) {
memcpy(&((char *) dest)[width * 6], dest, width * 6);
n -= width;
width <<= 1; // double w
}
if (n > 0) {
memcpy(&((char *) dest)[width * 6], dest, n * 6);
}
}
优化:规模n
and width
by 6.
[Edit]
更正目的地@SchighSchagh https://stackoverflow.com/users/1072468/schighschagh
添加演员阵容(char *)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)