我正在写一个实时代码,所以时间很重要
我正在使用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;
对更快代码的任何建议?
答案 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