小编moh*_*uje的帖子

使用 std::optional 来避免函数中的默认参数有什么好处吗?

我正在将代码移植到 C++17,尝试尽可能使用新功能。我喜欢的一件事是使用std::optional在某些情况下可能会失败的函数中返回或不返回值的想法。

我很好奇这个新特性的可能用途,我正在考虑开始使用它来替换函数中的可选参数,所以:

void compute_something(int a, int b, const Object& c = Object(whatever)) {
   // ...
}
Run Code Online (Sandbox Code Playgroud)

变成:

void compute_something(int a, int b, std::optional<Object> c) {
   auto tmp = c.value_or(Object(whatever));
   // ...
}
Run Code Online (Sandbox Code Playgroud)

根据官方文档:

如果一个可选项包含一个值,则保证该值作为可选对象占用空间的一部分进行分配,即永远不会发生动态内存分配。因此,即使定义了 operator*() 和 operator->() ,可选对象也建模对象,而不是指针。

因此,每次我们使用 std::optional 传递参数时,它意味着创建副本,如果对象很大,这可能会导致性能下降。

我喜欢这个想法,因为它使代码更简单易懂,但是有什么好处吗?

c++ c++11 c++17 stdoptional

10
推荐指数
2
解决办法
5982
查看次数

性能差异:std :: accumulate vs std :: inner_product vs Loop

今天,当我尝试实现这个简单的操作时,我想分享一些让我头脑发热的东西:

在此输入图像描述

我发现了执行相同操作的不同方法:

  1. 通过使用std::inner_product.
  2. 实现谓词并使用该std::accumulate函数.
  3. 使用C风格的循环.

我想通过使用Quick Bench并启用所有优化来执行一些基准测试.

首先,我将两个C++替代品与浮动值进行了比较.这是使用的代码std::accumulate:

const auto predicate = [](const double previous, const double current) {
    return previous + current * current;
};
const auto result = std::accumulate(input.cbegin(), input.cend(), 0, predicate);
Run Code Online (Sandbox Code Playgroud)

通过使用以下std::inner_product功能与此代码:

const auto result = std::inner_product(input.cbegin(), input.cend(), input.cbegin(), 1);
Run Code Online (Sandbox Code Playgroud)

在启用所有优化的情况下运行基准测试后,我得到了以下结果:

在此输入图像描述

两种算法似乎都达到了相同的性能.我确实想进一步尝试C实现:

double result = 0;
for (auto i = 0; i < input.size(); ++i) {
  result += input[i] * input[i];
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,我发现:

在此输入图像描述

我没想到这个结果.我确定有什么问题所以我确实检查了GCC的实现:

template<typename _InputIterator1, typename _InputIterator2, typename …
Run Code Online (Sandbox Code Playgroud)

c++ profiling stl language-lawyer c++14

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

标签 统计

c++ ×2

c++11 ×1

c++14 ×1

c++17 ×1

language-lawyer ×1

profiling ×1

stdoptional ×1

stl ×1