相关疑难解决方法(0)

std :: optional-用{}或std :: nullopt构造为空?

我认为初始化std::optionalwith与std::nullopt默认构造相同。

它们在cppreference中的描述与形式(1)相同。

但是,Clang和GCC似乎都不同地对待这些玩具示例函数。

#include <optional>

struct Data {
    char large_data[0x10000];
};

std::optional<Data> nullopt_init() {
  return std::nullopt;
}

std::optional<Data> default_init() {
  return {};
}
Run Code Online (Sandbox Code Playgroud)

编译器资源管理器似乎暗示使用std::nullopt会简单地设置“ contains”标志,

nullopt_init():
    mov     BYTE PTR [rdi+65536], 0
    mov     rax, rdi
    ret
Run Code Online (Sandbox Code Playgroud)

虽然默认构造将值初始化整个类。这在功能上是等效的,但几乎总是比较昂贵。

default_init():
    sub     rsp, 8
    mov     edx, 65537
    xor     esi, esi
    call    memset
    add     rsp, 8
    ret
Run Code Online (Sandbox Code Playgroud)

这是故意行为吗?什么时候应该优先使用另一种形式?

c++ optional c++17

28
推荐指数
2
解决办法
825
查看次数

标签 统计

c++ ×1

c++17 ×1

optional ×1