-2

可能重复:
内联函数与预处理器宏
什么是内联函数的概念,它与宏有何不同?

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

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

老实说,我会问哪个更快,但是我在 SO 上看到了很多,所以问哪个更好会给我知识。(是的!我是知识猎手)

4

4 回答 4

4

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

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

除非你真的需要,否则不要使用宏(标题保护,做重复的事情等)。宏在几个方面都是邪恶的,如果您在线搜索信息,您可以阅读很多相关信息。

于 2012-09-26T17:53:19.737 回答
2

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

宏将由预处理器展开,所以它总是内联的。该宏也不是类型安全的并且具有全局范围。

函数是首选。

于 2012-09-26T17:53:24.420 回答
0

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

顺便说一句,应编写宏((seconds) / 60)以确保在所有情况下都使用预期的分组。

于 2012-09-26T17:57:45.037 回答
0

不幸的是,哪个更快是唯一知道的方法是分析的情况之一。但是,我怀疑在典型的发布构建设置中结果是相同的。

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

除非绝对必要,否则我会避免使用宏。我认为它们是编译时查找和替换。我认为查找和替换在最坏的情况下是极其危险的。实际上,我写了一两篇关于为什么我如此强烈地不喜欢#define 宏的帖子......

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

于 2012-09-26T18:00:09.987 回答