首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在单个命令中存储8个字节?

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

Stack Overflow用户
提问于 2016-08-07 12:14:25
回答 3查看 243关注 0票数 1

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

我用的是C++的直觉

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

代码语言:javascript
复制
char* buff = foo(); 
for (auto i = 0; i < 8; i++) 
{
    buff[i] = 0x00; 
}

寻找类似的东西

代码语言:javascript
复制
_mm256_store_ps(...)

我想这么做,但这行不通(我不知道为什么)

代码语言:javascript
复制
_int64* buff = foo(); 
*buff = 0x00000000; 

有更快代码的建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-07 12:24:18

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

代码语言:javascript
复制
char* buff = foo();
*((uint64_t*)buff) = 0;

因为char*可以别名任何东西,所以这是安全的。但是,如果buff有一种不同的类型,比如short *,这是不安全的。

票数 1
EN

Stack Overflow用户

发布于 2016-08-07 12:27:42

让编译器考虑一下实现它的最佳方法:

代码语言:javascript
复制
memset(buff, 0, 8);

当然,如果这是非常关键的,那么看看它生成的代码。

票数 4
EN

Stack Overflow用户

发布于 2016-08-07 21:47:00

优化时,始终从编译器所做的工作开始。

代码语言:javascript
复制
#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的指令:

基于哥德波特的演示

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38814024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档