是否可以在单个命令中存储 8 个字节
Is it possible to store 8 bytes in single command
我正在编写实时代码,所以时间很重要
我正在使用 C++ 英特尔直觉
我想知道是否可以在单个命令中存储 8 个无符号字符(8 字节)而不是使用循环?
char* buff = foo();
for (auto i = 0; i < 8; i++)
{
buff[i] = 0x00;
}
寻找类似于
的东西
_mm256_store_ps(...)
我想过这样做,但是这行不通(我不知道为什么)
_int64* buff = foo();
*buff = 0x00000000;
对更快的代码有什么建议吗?
您不需要内部函数,因为普通整数指令是以 8 位、16 位、32 位或 64 位增量存储零的最有效方式。
char* buff = foo();
*((uint64_t*)buff) = 0;
因为 char*
可以为任何东西起别名,所以这是安全的。但是如果 buff
有不同的类型,比如 short *
.
,那么 不 是安全的
让编译器操心最好的办法:
memset(buff, 0, 8);
当然,如果这真的很关键,请查看它生成的代码。
优化时,始终从查看编译器的功能开始。
#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 , %rsp
call foo()
movq [=11=], (%rax) ; << Here
addq , %rsp
ret
f2():
subq , %rsp
call foo()
movq [=11=], (%rax) ; << Here
addq , %rsp
ret
f3():
subq , %rsp
call foo()
movq [=11=], (%rax) ; << Here
addq , %rsp
ret
我正在编写实时代码,所以时间很重要
我正在使用 C++ 英特尔直觉
我想知道是否可以在单个命令中存储 8 个无符号字符(8 字节)而不是使用循环?
char* buff = foo();
for (auto i = 0; i < 8; i++)
{
buff[i] = 0x00;
}
寻找类似于
的东西_mm256_store_ps(...)
我想过这样做,但是这行不通(我不知道为什么)
_int64* buff = foo();
*buff = 0x00000000;
对更快的代码有什么建议吗?
您不需要内部函数,因为普通整数指令是以 8 位、16 位、32 位或 64 位增量存储零的最有效方式。
char* buff = foo();
*((uint64_t*)buff) = 0;
因为 char*
可以为任何东西起别名,所以这是安全的。但是如果 buff
有不同的类型,比如 short *
.
让编译器操心最好的办法:
memset(buff, 0, 8);
当然,如果这真的很关键,请查看它生成的代码。
优化时,始终从查看编译器的功能开始。
#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 , %rsp
call foo()
movq [=11=], (%rax) ; << Here
addq , %rsp
ret
f2():
subq , %rsp
call foo()
movq [=11=], (%rax) ; << Here
addq , %rsp
ret
f3():
subq , %rsp
call foo()
movq [=11=], (%rax) ; << Here
addq , %rsp
ret