是否可以在单个命令中存储8个字节

时间:2016-08-07 12:14:25

标签: c++ intel intrinsics

我正在写一个实时代码,所以时间很重要

我正在使用C ++ Intel的直觉

我想知道是否可以在单个命令中存储8个无符号字符(8个字节)而不是使用循环?

char* buff = foo(); 
for (auto i = 0; i < 8; i++) 
{
    buff[i] = 0x00; 
}

寻找与

类似的内容
_mm256_store_ps(...)

我想过这样做,但这不起作用(我不知道为什么)

_int64* buff = foo(); 
*buff = 0x00000000; 

对更快代码的任何建议?

3 个答案:

答案 0 :(得分:4)

让编译器担心最好的方法:

memset(buff, 0, 8);

当然,如果这非常重要,请查看它生成的代码。

答案 1 :(得分:1)

您不需要内在函数,因为普通整数指令是以8位,16位,32位或64位为增量存储零的最有效方法。

char* buff = foo();
*((uint64_t*)buff) = 0;

由于char*可以为任何内容添加别名,因此这是安全的。但如果buff具有不同的类型,例如short *,则是安全的。

答案 2 :(得分:1)

优化时,请始终先查看编译器的功能。

#include <string.h>
#include <cstdint>

extern char* foo();

char* f1() {
  char* buf = foo();
  for (auto i = 0; i < 8; ++i)
    buf[i] = 0;
  return buf;
}

char* f2() {
  char* buf = foo();
  memset(buf, 0, 8);
  return buf;
}

char* f3() {
  char* buf = foo();
  *((uint64_t*)buf) = 0ULL;
  return buf;
}

使用带-O3的GCC编译,上述每个输出都是用于存储0的单个指令:

godbolt上的演示

f1():
        subq    $8, %rsp
        call    foo()
        movq    $0, (%rax)  ; << Here
        addq    $8, %rsp
        ret
f2():
        subq    $8, %rsp
        call    foo()
        movq    $0, (%rax)  ; << Here
        addq    $8, %rsp
        ret
f3():
        subq    $8, %rsp
        call    foo()
        movq    $0, (%rax)  ; << Here
        addq    $8, %rsp
        ret