【发布时间】:2015-02-16 22:03:52
【问题描述】:
我需要将一个 6 字节的整数值复制到一个内存区域中,从它的开头开始并尽快。如果硬件支持这样的操作,我想使用它(我现在在 x64 处理器上,编译器是 GCC 4.6.3)。
memset 不适合这项工作,因为它只能复制字节。 std::fill 也不好,因为我什至无法定义迭代器,在内存区域的 6 个字节宽度位置之间跳转。
所以,我想要一个函数:
void myMemset(void* ptr, uint64_t value, uint8_t width, size_t num)
这看起来像memset,但还有一个额外的参数width 来定义要从value 复制多少字节。如果这样的东西可以用 C++ 来表达,那就更好了。
我已经知道明显的myMemset 实现,它将调用memcpy in 循环,最后一个参数(要复制的字节)等于width。我也知道,我可以定义一个大小为 6 * 8 = 48 字节的临时内存区域,用 6 字节整数填充它,然后将 memcpy 填充到目标区域。
我们可以做得更好吗?
【问题讨论】:
-
我认为你的最后一种方法是我们能得到的最好的方法。手动填充一个 n 字节的小区域,然后
memcpy它一次加倍,然后memcpy2 n 字节的加倍区域得到 4 n 个字节等等。最后,memcpy完成任务的最后一部分(通常不是 2 的幂)。你只会有一个对数的函数调用。 -
我不明白
memset()和std:fill能为您做什么,因为您说要复制一个数字,而不是清除它。memcpy(&destination,&source,6)是最好的,你觉得有什么可以改进的? -
您可以扩展您的最后一个想法,甚至超过 48 个字节。就此而言,您可以使其递归;手动填充前 6 个字节,然后使用 memcpy 将其扩展为 12 个字节,扩展为 24 个字节、48 个字节等。
-
我很好奇您为什么使用 6 字节整数。如果是为了节省空间,我建议你重新考虑。即使您不对数据使用 SSE 指令,使用自然对齐的 8 字节整数所带来的加速也可能超过节省的空间。但你还没有真正告诉我们你在做什么。
-
最 C++ 的方式是迭代器和
std::copy: coliru.stacked-crooked.com/a/7a521244b39e3567 为什么需要更快的东西?