相关疑难解决方法(0)

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

考虑这两种可以代表"可选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 ++ trunkclang ++ 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)

godbolt.org上的实例


为什么get_std_optional_int()需要三个mov指令,而get_my_optional()只需要一个 …

c++ performance assembly x86-64 c++17

65
推荐指数
3
解决办法
3365
查看次数

类型特征的基本原理检查类特殊函数的平凡性

除了std::is_trivial和之外std::is_trivially_copyable,C++ 11提供了许多类型特征,用于检查类型是否具有简单的构造函数,析构函数和复制/移动赋值运算符,即:

  • std::is_trivially_constructible
  • std::is_trivially_default_constructible
  • std::is_trivially_copy_constructible
  • std::is_trivially_move_constructible
  • std::is_trivially_assignable
  • std::is_trivially_copy_assignable
  • std::is_trivially_move_assignable
  • std::is_trivially_destructible

他们最初的预期目的是什么?当然,一些C++委员会文件必须解释它们包含在C++标准库中的基本原理.

c++ language-lawyer c++11 c++14 c++17

6
推荐指数
1
解决办法
167
查看次数

标签 统计

c++ ×2

c++17 ×2

assembly ×1

c++11 ×1

c++14 ×1

language-lawyer ×1

performance ×1

x86-64 ×1