宏与&之间有什么区别?关于执行速度的内联函数?

时间:2011-01-21 16:57:46

标签: c++ inline

编译器如何处理宏上的内联函数以减少执行时间?

8 个答案:

答案 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
  1. 内联函数由编译器解析1.宏由预处理器处理。
  2. 内联函数可以写在|里面2.宏不能写在里面。 班级。 |
  3. 内联执行strick类型检查| 3.宏不执行严格的检查。
  4. 内联函数由关键字继续。 | 4.宏在哪里进行#include                                            |中,定义
  5. 包含参数的内联函数是| 5.包含表达式的宏必须是 处理一次然后可以使用很多|每次使用时都会处理。 时间。 |

答案 6 :(得分:0)

内联函数遵循在正常函数上强制执行的所有类型安全协议。

使用与任何其他函数相同的语法指定内联函数,除了它们在函数声明中包含inline关键字。

作为内联函数的参数传递的表达式将被计算一次。在某些情况下,作为参数传递给宏的表达式可以多次计算。

要记住的另一件事是宏在预编译时被扩展,因此您无法使用它们进行调试。但是,对于内联函数,情况并非如此。

范围在宏的情况下是全局的,局部范围可以应用于内联函数。

答案 7 :(得分:0)

内联函数远胜于宏。例如,如果内联函数足够大以减慢代码的执行速度,编译器不会使其内联,因为宏没有这样的检查