编译器如何处理宏上的内联函数以减少执行时间?
答案 0 :(得分:10)
如果这样做会更快,编译器也允许不内联函数,而编译器不能内联宏。此外,内联函数比宏更安全。
答案 1 :(得分:1)
内联函数与宏非常相似,因为它们都在编译时展开,但宏由预处理器扩展,而内联函数由编译器解析。
答案 2 :(得分:1)
这里要注意的最重要的事情是宏是纯文本替换,由预处理器完成。编译器(在预处理步骤之后)不知道或不关心宏是什么。
示例:
//this:
#define PRINT(s) std::cout << s;
int main(int, char**)
{
PRINT("hello world")
return 0;
}
//Will have identical codegen(in the same compiler version of course) to this:
int main(int, char**)
{
std::cout << "hello world";
return 0;
}
对于内联函数,编译器知道何时内联函数调用,并且它有更多关于它的用法的上下文信息。正如其他人所提到的,这也意味着这是一个请求。如果编译器认为内联函数更有害,那么它将把它作为常规函数调用。与宏相比,编译器在使用宏时没有关于代码重复的信息。
总之,如果您的代码可以使用内联函数,那么使用它而不是宏。您正在通过为编译器提供更多信息来帮助编译器改进代码。
答案 3 :(得分:1)
而且,MACROS无法访问类成员变量。它不了解范围。这里,内联函数很有用。
答案 4 :(得分:0)
应该没有速度差异(假设合理的小代码),因为它们都会被编译到它们被使用/调用的地方。它是使用函数的更好的做法,因为宏可以有一种方法来做不可预知的事情。
答案 5 :(得分:0)
Inline Function Macros
答案 6 :(得分:0)
内联函数遵循在正常函数上强制执行的所有类型安全协议。
使用与任何其他函数相同的语法指定内联函数,除了它们在函数声明中包含inline关键字。
作为内联函数的参数传递的表达式将被计算一次。在某些情况下,作为参数传递给宏的表达式可以多次计算。
要记住的另一件事是宏在预编译时被扩展,因此您无法使用它们进行调试。但是,对于内联函数,情况并非如此。
范围在宏的情况下是全局的,局部范围可以应用于内联函数。
答案 7 :(得分:0)
内联函数远胜于宏。例如,如果内联函数足够大以减慢代码的执行速度,编译器不会使其内联,因为宏没有这样的检查