在这种情况下,内联函数的宏是什么更好?

时间:2012-09-26 17:51:03

标签: c++

  

可能重复:
  Inline functions vs Preprocessor macros
  what is concept of Inline function and how it is differ from macro?

inline unsigned int getminutes( unsigned int seconds )
{
    return( seconds / 60 );
}

#define GetMinutes(seconds) (seconds) / (60)

老实说,我会问哪一个更快,但我在S.O上看到了很多,问哪一个更好会让我知识。 (是的!我是知识猎人)

4 个答案:

答案 0 :(得分:4)

如果您可以使用内联函数来实现相同功能,请不要使用宏。假设您使用相当不错的解决方案,编译器将为您提供的两个解决方案生成完全相同的代码。

当然不能保证内联函数实际上会被内联,但在这些情况下,如果你的编译器无法内联该函数,那么它可能是一个非常糟糕的函数。

除非你真的需要(标题保护,做重复的东西等),否则不要使用宏。宏在各方面都是邪恶的,如果你在网上搜索信息,你可以阅读很多内容。

答案 1 :(得分:2)

如果您认为编译器无法保证使用inline,我想宏会更快。如果函数没有内联,那么你就有了函数调用的开销。

宏将由预处理器扩展到位,因此它始终是内联的。 宏也不是类型安全的,具有全局范围。

首选功能。

答案 2 :(得分:0)

使用良好的优化编译器,性能将是相同的。不同之处在于内联函数或多或少是对编译器的建议。虽然编译器在大多数情况下应该遵循该建议,但宏版本将强制编译器内联代码。

另外,您的宏应该写为((seconds) / 60),以确保在所有情况下都使用预期的分组。

答案 3 :(得分:0)

不幸的是,更快是其中一种情况,其中唯一的方法是分析。但是,我怀疑在典型的发布版本设置中结果是一样的。

更好,但是,我会说内联函数。更容易调试。比宏更安全。

除非绝对必要,否则我会避免使用宏。我认为它们是编译时查找和替换。在最坏的情况下,我认为发现和替换是非常危险。我实际上写了一个posttwo来解释为什么我非常不喜欢#define宏......

我运行的另一个建议是:编译器比你更了解。宏将强制内联,即使它实际上对性能不利。 inline会将其建议为内联候选者,但如果不符合内联标准,则可能不会内联。