【问题标题】:G++ Inline WarningG++ 内联警告
【发布时间】:2013-11-01 00:49:10
【问题描述】:

以下是使用 G++ (GCC) 版本 4.3.3 时导致警告的一些内联代码。我只在 ARM 机器上的这个(4.3.3)旧 GCC 版本上遇到这个问题。在运行 GCC 4.5.2 的 x86 机器上,此问题不存在。不幸的是,我目前无法更新 ARM 机器,但我想知道是否应该关注以下错误...

// myclass.h
class MyClass {
 public:
  MyClass();
  ~MyClass() { Cleanup(); }
  void Cleanup();
};
inline void MyClass::Cleanup() {
  // do some minor cleanup here, GCC DOES inline this function
  // with -Winline, I see that no non-inline warnings are thrown
}

问题是我收到警告:“void MyClass::Cleanup() 在声明为内联之前已使用”

这是我应该关注的警告吗?我一直只在函数定义中内联,基本上遵循这个 (http://www.parashift.com/c++-faq/where-to-put-inline-keyword.html)“最佳实践”。

提前感谢您的帮助。

【问题讨论】:

  • 如果您打算实现MyClass 成员Cleanup(),您可能希望使用类名来解析内联。 inline void MyClass::Cleanup() 更有可能成为您的目标。
  • 哎呀,忘了,这实际上是在代码中,但忘了把它放在我的问题中......见上面的编辑。
  • ...这就是为什么发布真实代码总是一个好主意。
  • ...这就是您因违反 NDA 等而被解雇的方式。另外,上面的代码是一个简单的、可重现的错误示例。当然我忘记了一件小事,但是让我休息一下,这是漫长的一天。
  • 谁说过发布实际受保护抄写代码?你自己说的:上面是一个简单的可重现的例子。所以它不是你想要的原因是......因为它简单了?让休息一下。发布正确 概念代码可能很无聊,但回复不正确 概念代码也是如此,只是发现您认为没有问题的内容。它一次给你;我们每天都会看到它一百次。所以请原谅我,如果我要求注意避免它。很抱歉让您度过了漫长的一天,我的一天并没有更短,我可以保证。

标签: c++ gcc g++ inline compiler-warnings


【解决方案1】:

代码是有效的,因此来自旧 G++ 的警告是虚假的。

我不知道你是否应该担心。 G++ 可能会基于其认为代码中存在问题的虚假信念做了一些奇怪的事情,但我对此表示怀疑——它可能按预期工作,只是发出虚假警告。它可能无法将其内联到析构函数中,但这可能没什么大不了的,-Winline 似乎表明情况并非如此。

【讨论】:

  • 由于 inline 关键字仅用作提示,最坏的情况是 G++ 看不到提示,并且正在使用降低的启发式进行内联。我不了解 G++,但如果函数为 inline,clang 会将内联的最大函数大小增加 50%。如果内联至关重要,您可以使用编译器扩展。 G++ 4.3.3 支持__attribute__((always_inline)),这将保证内联。
  • 这不是单独的提示,它还允许在多个翻译单元中定义函数(不会导致多个定义错误)和一些其他语义效果。就优化器的内联而言,这只是一个提示,这是真的。
  • 对不起,我的意思是关于优化器输出,我应该更清楚。
猜你喜欢
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多