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

标签 c++ c memory

我需要将一个 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/

相关文章:

c - ARM 未对齐内存访问解决方法

ruby - JSON的基于流的解析和写入

c++ - 从 dll 中读取链接器信息

c++ - 如何使用 boost.lambda 和 boost.range 从容器中进行选择?

c++ - 将 C++ 代码拆分为多个翻译单元是否会增加可执行文件大小的开销?

c - 逐 block 反转文件内容

c - 制表符和空格如何影响 C 中的代码大小

memory - 倒排页表如何处理多个进程访问同一帧

在 Windows 上通过管道进行 Java/C++ 通信

c++ - 如何找到项目中定义宏的位置?