gpt4 book ai didi

c++ - 如何快速将 6 字节无符号整数复制到内存区域?

转载 作者:IT王子 更新时间:2023-10-28 23:35:17 26 4
gpt4 key购买 nike

我需要将一个 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 中有多少 bytes> 复制。如果这样的东西可以用 C++ 来表达,那就更好了。

我已经知道明显的 myMemset 实现,它会在循环中调用 memcpy,最后一个参数(要复制的字节)等于 width。我也知道,我可以定义一个大小为 6 * 8 = 48 字节的临时内存区域,用 6 字节整数填充它,然后将其 memcpy 到目的地区域。

我们可以做得更好吗?

最佳答案

一些东西沿着@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);
}
}

优化:将 nwidth 缩放 6。

[编辑]
更正目的地 @SchighSchagh
添加类型转换(char *)

关于c++ - 如何快速将 6 字节无符号整数复制到内存区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28551153/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com