C定义语句函数调用一次还是每次使用宏时调用?

C定义语句函数调用一次还是每次使用宏时调用?,c,macros,C,Macros,在下面的C代码中,该宏是将MIN\u WORDS的所有实例替换为size\u to\u WORDS(0)还是将替换为该函数调用的结果 #define MIN_WORDS size_to_words(0) 我不希望每次调用函数都会带来性能开销。好问题,要了解发生了什么,您需要认识到这两件事 宏由预处理器解析 函数调用在程序执行期间解析 将发生的情况如下: 编译包含宏的代码时,预处理器 将首先用宏的定义替换所有宏 创建可执行文件时,将使用所有这些 函数调用。在运行时,您将调用该函数 每一次

在下面的C代码中,该宏是将
MIN\u WORDS
的所有实例替换为
size\u to\u WORDS(0)
还是将替换为该函数调用的结果

#define MIN_WORDS size_to_words(0)

我不希望每次调用函数都会带来性能开销。

好问题,要了解发生了什么,您需要认识到这两件事

  • 宏由预处理器解析
  • 函数调用在程序执行期间解析
将发生的情况如下:

  • 编译包含宏的代码时,预处理器 将首先用宏的定义替换所有宏
  • 创建可执行文件时,将使用所有这些 函数调用。在运行时,您将调用该函数 每一次
如果您使用优化标志编译,它可能会为您优化不必要的函数调用,但是,请查看gcc-O3和-O2标志并查看它们的作用


tl;dr:预处理器不会解析函数调用并优化代码,因此,如果宏是函数,则除非为您进行优化,否则代码将调用函数。

好问题,要理解发生了什么,您需要识别这两件事

  • 宏由预处理器解析
  • 函数调用在程序执行期间解析
将发生的情况如下:

  • 编译包含宏的代码时,预处理器 将首先用宏的定义替换所有宏
  • 创建可执行文件时,将使用所有这些 函数调用。在运行时,您将调用该函数 每一次
如果您使用优化标志编译,它可能会为您优化不必要的函数调用,但是,请查看gcc-O3和-O2标志并查看它们的作用


tl;dr:预处理器不会解析函数调用并优化代码,因此如果宏是函数,则除非为您进行优化,否则代码将调用函数。

函数调用在运行时进行。宏替换发生在编译时。此外,除非函数很长且需要花费大量时间,否则函数的实际调用足够快,几乎无法测量。你没有尝试做任何事吗?“不想要”或“不能拥有”?我很少进行优化,除非有几个因素,甚至是速度的大小需要提高。函数调用发生在运行时。宏替换发生在编译时。此外,除非函数很长且需要花费大量时间,否则函数的实际调用足够快,几乎无法测量。你没有尝试做任何事吗?“不想要”或“不能拥有”?我很少优化,除非有几个因素,甚至是速度的大小来获得。