【问题标题】:Which is faster inline function or MACRO [closed]哪个是更快的内联函数或 MACRO [关闭]
【发布时间】:2016-09-28 11:51:46
【问题描述】:

我相信预处理器在编译之前将宏扩展为代码中的副本文本,而编译器会在每个函数调用中写入已编译函数定义的副本。因此,在这两种情况下,我们都避免了常规函数调用的开销,但在这种情况下,内联函数或 MACRO 哪个更快且开销更少?

【问题讨论】:

  • 你能告诉我预处理代码中两者的区别吗?
  • 示例我有 MAX (x,y) ( x>y ? x:y) .... int (int x, inty){ return x>y ? x:y;}
  • 更快?你的意思是开始工作?
  • 鉴于一个简单的宏可能需要长达 48 小时才能正常工作,因为宏会生成 SO“我的宏无法正常工作”问答,因此内联代码的速度要快 10 的许多次方。跨度>
  • 在大多数情况下,您需要获得超过 500 毫秒才能使时间可以忽略不计。通过使用内联函数(可能是纳秒,也可能是微秒)节省的时间被等待 I/O 或操作系统换出您的程序(并运行另一个任务)所浪费。宁愿把时间花在正确性和稳健性上。大多数用户讨厌经常崩溃的快速程序。 顺便说一句,500 毫秒或 1/2 秒是击键之间的快速时间。

标签: c++ c performance function macros


【解决方案1】:

宏只会“更快”,因为它不会留给编译器试探法是否将内联宏。考虑到宏的缺点,通常最好把这个决定留给编译器。调试级别和相应的源代码也存在问题。优化级别,“强制”内联,例如,__attribute__ ((__always_inline__)) (gcc/clang)。更重要的是,您可以避免常见的陷阱,例如宏中的多个表达式扩展/求值。

我还没有做过 S.O.问题搜索(你应该养成这样做的习惯),但我怀疑这个问题很久以前就已经得到了更详细的回答!

【讨论】:

  • OTOH,如果编译器没有内联函数,可能有充分的理由不这样做。它甚至可以加快代码速度!你错过了其他重要的区别。也许搜索一个副本真的更好
  • @Olaf - 我当然错过了其他用途。宏仍然出现在高性能代码中的事实。就像在 Linux 和其他高性能软件中发现的 __asm__ 块宏一样。例如,非尾递归调用不能被内联。由“轻量级”可见函数调用的翻译单元中昂贵的静态函数会使代码膨胀。
  • 还有其他需要宏的原因,尤其是汇编代码或类似模板的代码生成。有这个问题,例如使用需要立即操作数的断点指令,并且 gcc 无法将内联参数正确传递给 asm 约束,因此汇编程序抱怨。但是大多数宏现在已经过时并且通常源于错过/忽略了最新进展(包括 LTO)的人。提出上述问题的人通常不需要类似函数的宏(无意冒犯,只是观察)。
  • @Olaf - 现代 C/C++ 的最后手段...但我们不能完全摆脱它们,就像每个人最喜欢的疯狂叔叔一样,goto :)
  • 这就是我的观点。在 C 中比在 C++ 中少(请注意术语“C/C++”!它经常被初学者甚至一些自称为专业人士的人误解)。我自己在某种程度上使用它们,但谨慎且始终有据可查,为什么它不能成为 inline 函数。
猜你喜欢
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
相关资源
最近更新 更多