为啥 GCC 说“不再支持命名返回值”?
Posted
技术标签:
【中文标题】为啥 GCC 说“不再支持命名返回值”?【英文标题】:Why does GCC say "named return values no longer supported"?为什么 GCC 说“不再支持命名返回值”? 【发布时间】:2010-11-22 14:36:34 【问题描述】:我不小心把函数定义的左大括号放在了 return 语句之后
int id(int k) return k;
但是 GCC 回答了一个奇怪的错误消息
错误:不再支持命名返回值
谁能解释一下这个奇怪的功能是什么?我从来没有听说过。
【问题讨论】:
也许是 NRVO 的一些早期实现,您必须命名变量以使其省略副本? Go 已命名结果参数,golang.org/doc/effective_go.html 【参考方案1】:请参阅here - 通过在函数头中显式定义命名返回值来实现早期 NRVO。
添加了对没有此扩展的 NRVO 的原生支持 here - GCC 3.1 发布系列。
上下文的简要剪切和粘贴:
G++ 现在支持“命名返回 价值优化”:对于类似的代码
A f () A a; ... return a;
G++ 将在返回中分配 a 值槽,这样返回就变成了 无操作。为此,所有返回 函数中的语句必须返回 同一个变量。
【讨论】:
NRVO 在我花了很长时间试图弄清楚为什么 VC++ 7.1(这是最后一个没有 NRVO 的 Microsoft C++)在返回大时如此缓慢@987654324 @结果... 在 VC++2008 中是不是也有一些东西,比如调试版本中没有 NRVO? @Matthieu - 这不会让我感到惊讶,调试 Visual C++ 普遍偏向于可调试性而不是性能(例如,参见“已检查的 STL”)。我只知道 NRVO 最早是在 VC8 中进入 Visual C++ 的。 这是一个古老的东西。至少可以追溯到 93 年 6 月的 2.4.5。在那个时候,g++ 中还有其他实验性的东西(我记得 min/max 运算符、go 接口的前身签名......)。【参考方案2】:见here
他们是removed in gcc3.4
【讨论】:
【参考方案3】:这是GCC extension、removed in GCC 3.4。
【讨论】:
以上是关于为啥 GCC 说“不再支持命名返回值”?的主要内容,如果未能解决你的问题,请参考以下文章