首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么std::optional<int>的构建比std::pair<int,bool>更昂贵?

为什么std::optional<int>的构建比std::pair<int,bool>更昂贵?
EN

Stack Overflow用户
提问于 2017-10-03 19:55:05
回答 2查看 4.4K关注 0票数 70

考虑这两种可以表示“可选int”的方法:

代码语言:javascript
复制
using std_optional_int = std::optional<int>;
using my_optional_int = std::pair<int, bool>;

给定这两个函数..。

代码语言:javascript
复制
auto get_std_optional_int() -> std_optional_int 
{
    return {42};
}

auto get_my_optional() -> my_optional_int 
{
    return {42, true};
}

...both g++ trunkclang++ trunk (带有-std=c++17 -Ofast -fno-exceptions -fno-rtti__)会生成以下组件:

代码语言:javascript
复制
get_std_optional_int():
        mov     rax, rdi
        mov     DWORD PTR [rdi], 42
        mov     BYTE PTR [rdi+4], 1
        ret

get_my_optional():
        movabs  rax, 4294967338 // == 0x 0000 0001 0000 002a
        ret

为什么get_std_optional_int() mov 需要三条mov指令,而 get_my_optional() 只需要一条 QoI指令这是一个std::optional问题,还是std::optional的规范中有什么东西阻止了这种优化?

还请注意,无论如何,函数的用户可能都会被完全优化:

代码语言:javascript
复制
volatile int a = 0;
volatile int b = 0;

int main()
{
    a = get_std_optional_int().value();
    b = get_my_optional().first;
}

...results in:

代码语言:javascript
复制
main:
        mov     DWORD PTR a[rip], 42
        xor     eax, eax
        mov     DWORD PTR b[rip], 42
        ret
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46544019

复制
相关文章

相似问题

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