gpt4 book ai didi

c - 何时在 C 中使用类函数宏

转载 作者:太空狗 更新时间:2023-10-29 16:42:07 29 4
gpt4 key购买 nike

今天晚上我正在阅读一些用 C 编写的代码,并且在该文件是类似函数的宏 HASH:

#define HASH(fp) (((unsigned long)fp)%NHASH)

这让我想知道,为什么有人会选择实现一个使用类似函数的宏而不是实现以这种方式运行它作为一个普通的 Vanilla C 函数?有什么优点和每种实现的缺点?

非常感谢!

最佳答案

这样的宏避免了函数调用的开销。

它可能看起来并不多。但在您的示例中,宏会变成 1-2 条机器语言指令,具体取决于您的 CPU:

  • 从内存中取出fp的值放入寄存器
  • 取寄存器中的值,对一个固定值进行取模(%),并保存在同一个寄存器中

而等价的功能将是更多的机器语言指令,通常类似于

  • 将fp的值压入栈中
  • 调用该函数,该函数还将下一个(返回)地址放入堆栈
  • 也许在函数内部构建一个栈帧,这取决于 CPU 架构和 ABI 约定
  • 从栈中取出fp的值,放入寄存器
  • 取寄存器中的值,对一个固定值进行取模(%),并保存在同一个寄存器中
  • 根据 CPU 和 ABI,也许从寄存器中取出值并将其放回堆栈
  • 如果构建了栈帧,则展开它
  • 从堆栈中弹出返回地址并继续执行那里的指令

还有很多代码,嗯?如果您正在做一些事情,比如在 GUI 的窗口中渲染数万个像素中的每一个像素,那么如果您使用宏,运行速度会快得多。

就个人而言,我更喜欢使用 C++ 内联,因为它更具可读性且更不容易出错,但内联实际上也更多地是对编译器的提示,它不必接受。预处理器宏是编译器无可争辩的一把大锤。

关于c - 何时在 C 中使用类函数宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1616802/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com