gpt4 book ai didi

c++ - std::可选 - 使用 {} 或 std::nullopt 构造空?

转载 作者:行者123 更新时间:2023-12-02 11:33:47 25 4
gpt4 key购买 nike

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

They are described as equivalent at 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 {};
}

Compiler Explorer seems to imply使用 std::nullopt 将简单地设置一个字节has_value”标志,

nullopt_init():
mov BYTE PTR [rdi+65536], 0
mov rax, rdi
ret

默认构造将对类的每个字节进行值初始化。这在功能上是等效的,但几乎总是更昂贵。

default_init():
sub rsp, 8
mov edx, 65537
xor esi, esi
call memset
add rsp, 8
ret

这是故意行为吗?什么时候应该首选一种形式而不是另一种形式?

<小时/>

更新:GCC(自 v11.1 起)​​和 Clang(自 v12.0.1 起)​​now treat both forms efficiently.

最佳答案

在本例中,{} 调用值初始化。如果可选的默认构造函数不是用户提供的(其中“不是用户提供的”大致意思是“在类定义中隐式声明或显式默认”),则会导致整个构造函数的零初始化对象。

是否这样做取决于特定std::Optional实现的实现细节。看起来 libstdc++ 的 可选 的默认构造函数不是用户提供的,但 libc++ 是。

关于c++ - std::可选 - 使用 {} 或 std::nullopt 构造空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57964217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com