我最近发现std::optional了一种提高代码清晰度的方法,尤其是对于函数的返回值。但是我对它对性能的影响有疑问。更具体地说,我想知道是否可以编写类似于以下代码的代码,以允许编译器应用命名返回值优化。
struct Data
{
int x;
int y;
};
std::optional<Data> makeData(bool condition)
{
Data data;
if(condition)
{
data.x = 2.0;
data.y = 2.0;
return data;
}
else
{
return {};
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,在这种情况下,as-if 规则已经足够了:Data可以简单地复制和简单地破坏,因此您无法观察编译器是否复制它,或者它是否直接将其构造到std::optional<Data>返回对象中。不需要 NRVO 来防止复制。
假设您提供了Data一个具有副作用的复制构造函数。那么 NRVO 是否适用的问题将是相关的。答案是否定的:NRVO 不适用,因为局部变量的类型与函数返回类型不同。为了让 NRVO 发生,你可以这样写:
std::optional<Data> r;
if (condition) {
r.emplace();
r.x = 2.0;
r.y = 2.0;
}
return r;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
421 次 |
| 最近记录: |