考虑这两种可以代表"可选int"的方法:
using std_optional_int = std::optional<int>;
using my_optional_int = std::pair<int, bool>;
Run Code Online (Sandbox Code Playgroud)
鉴于这两个功能......
auto get_std_optional_int() -> std_optional_int
{
return {42};
}
auto get_my_optional() -> my_optional_int
{
return {42, true};
}
Run Code Online (Sandbox Code Playgroud)
... g ++ trunk和clang ++ trunk (with -std=c++17 -Ofast -fno-exceptions -fno-rtti)产生以下程序集:
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
Run Code Online (Sandbox Code Playgroud)
为什么get_std_optional_int()需要三个mov指令,而get_my_optional()只需要一个 …
除了std::is_trivial和之外std::is_trivially_copyable,C++ 11提供了许多类型特征,用于检查类型是否具有简单的构造函数,析构函数和复制/移动赋值运算符,即:
std::is_trivially_constructiblestd::is_trivially_default_constructiblestd::is_trivially_copy_constructiblestd::is_trivially_move_constructiblestd::is_trivially_assignablestd::is_trivially_copy_assignablestd::is_trivially_move_assignablestd::is_trivially_destructible他们最初的预期目的是什么?当然,一些C++委员会文件必须解释它们包含在C++标准库中的基本原理.