我在写实时代码,所以时间很重要
我用的是C++的直觉
我想知道是否可以在单个命令中存储8个无符号字符(8个字节),而不是使用一个循环?
char* buff = foo();
for (auto i = 0; i < 8; i++)
{
buff[i] = 0x00;
}寻找类似的东西
_mm256_store_ps(...)我想这么做,但这行不通(我不知道为什么)
_int64* buff = foo();
*buff = 0x00000000; 有更快代码的建议吗?
发布于 2016-08-07 12:24:18
您不需要内在的,因为普通整数指令是以8位、16位、32位或64位增量存储零的最有效方法。
char* buff = foo();
*((uint64_t*)buff) = 0;因为char*可以别名任何东西,所以这是安全的。但是,如果buff有一种不同的类型,比如short *,这是不安全的。
发布于 2016-08-07 12:27:42
让编译器考虑一下实现它的最佳方法:
memset(buff, 0, 8);当然,如果这是非常关键的,那么看看它生成的代码。
发布于 2016-08-07 21:47:00
优化时,始终从编译器所做的工作开始。
#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;
}由GCC用-O3编译,上面每一个输出都是一个用于存储0的指令:
基于哥德波特的演示
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
rethttps://stackoverflow.com/questions/38814024
复制相似问题