gpt4 book ai didi

c++ - 存在错误代码时的输出参数与 NRVO

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:05:48 26 4
gpt4 key购买 nike

我们有一个广泛使用 out 参数的代码库,因为每个函数都可能因某些错误枚举而失败。这变得非常困惑,代码有时不可读。

我想消除这种模式并引入更现代的方法。

目标是转变:

error_t fn(param_t *out) {  
//filling 'out'
}
param_t param;
error_t err = fn(&param);

变成类似的东西:

std::expected<error_t, param_t> fn() {
param_t ret;
//filling 'ret'
return ret;
}
auto& [err, param] = fn();

以下问题是为了让自己和其他人相信这种改变是最好的:

  1. 我知道在标准层面上,NRVO 不是强制性的(与 c++17 中的 RVO 不同)但实际上它是否有可能不会在任何主要编译器中发生?
  2. 使用 out 参数代替 NRVO 有什么优势吗?
  3. 假设 NRVO 发生,生成的程序集是否有重大变化(假设优化的expected 实现[可能表示错误发生是否完全消失的 bool 值])?

最佳答案

首先,一些假设:

  1. 我们正在研究未内联的函数。在那种情况下,几乎可以保证它是绝对等价的。

  2. 我们假设函数的调用点在使用返回值之前实际检查了错误条件。

  3. 我们将假设返回值未使用部分数据进行预初始化。

  4. 我们假设我们只关心优化代码。

正在建立:

I know that on the standard level, NRVO is not mandatory (unlike RVO in c++17) but practically is there any chance it won't happen in any of the major compilers?

假设此时正在执行 NRVO 是一个安全的赌注。我敢肯定有人会想出一个不会发生的人为情况,但我通常相信在几乎所有用例中,NRVO 都是在当前的现代编译器上执行的。

话虽这么说,我绝不会依赖这种行为来确保程序正确性。 IE。我不会假设它不会由于 NRVO 被调用而制作带有副作用的奇怪复制构造函数。

Are there any advantages of using out parameters instead of NRVO?

通常不会,但就像 C++ 中的所有事物一样,在某些极端情况下它可能会出现。用于最大化缓存一致性的显式内存布局将是“通过指针返回”的一个很好的用例。

Assuming NRVO happens, is there a a significant change in the generated assembly (assuming an optimized expected implementation [perhaps with the boolean representing whether an error occured completly disappear])?

这个问题对我来说意义不大。 expected<>表现得更像 variant<>tuple<> ,因此“表示错误是否完全消失的 bool 值”实际上没有意义。

话虽如此,我认为我们可以使用 std::variant 来估计:

https://godbolt.org/g/XpqLLG

它是“不同的”,但在我看来不一定更好或更坏。

关于c++ - 存在错误代码时的输出参数与 NRVO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50554908/

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