C中的宏与函数之间的区别与指令存储器和速度有关

DAH*_*ANS 3 c macros c-preprocessor

根据我的理解,宏和函数之间的区别在于宏调用将被定义中的指令替换,而函数执行整个push,branch和pop -thing.这是对的,还是我理解错了?

另外,如果这是正确的,那就意味着,宏会占用更多空间,但会更快(因为缺少推送,分支和弹出指令),不是吗?

pts*_*pts 7

如果C编译器没有进行优化,那么您所写的关于性能影响的内容是正确的.但优化编译器可以内联函数就像它们是宏一样,因此内联函数调用以与宏相同的速度运行,并且没有推/弹开销.要触发内联,请在编译器设置中启用优化(例如gcc -O2),并将函数作为.h文件放入文件中static inline.

请注意,有时内联/宏更快,有时真正的函数调用更快,具体取决于代码和编译器.如果函数体非常短(并且大部分将被优化掉),通常内联比函数调用更快.

另一个重要区别是宏可以接受不同类型的参数,并且宏定义可以对多种类型有意义(但编译器不会为您进行类型检查,因此如果使用的话,可能会出现不需要的行为或隐藏的错误消息宏与错误的参数类型).这种多态性很难模仿C中的函数(但在C++中很容易使用函数重载和函数模板).

  • 当然,宏和内联函数之间最重要的区别之一是,如果参数是一个复杂的表达式,很容易无意中两次评估参数,或者弄乱优先级.没有理由比内联函数更喜欢宏.(当然,还有其他原因偶尔使用宏.例如,`__LINE__`和`__FILE__`只能在宏中工作.) (3认同)

Die*_*Epp 7

这可能是在20世纪80年代,但现代编译器要好得多.

函数并不总是推送和弹出堆栈,特别是如果它们是叶函数或具有尾调用.此外,函数通常是内联的,即使它们是在其他转换单元中定义的,也可以内联(这称为链接时优化).

但你是对的,一般情况下,当关闭优化时,内联宏并且不会内联函数.两个版本可能占用更多空间,这取决于宏/功能的细节.

函数以两种方式使用空间:正文使用空格,函数调用使用空格.如果函数体非常小,它实际上可以节省空间来内联它.