此功能是否保证内联扩展

时间:2011-03-31 18:43:38

标签: c++ c stack inline

我在工作中经历了一些代码,我发现了这个

inline
  FLAGS get_flags(void) {
  FLAGS res;
  memset(&res, 0, sizeof(res));
  return res
}

这是在程序中包含的头文件中声明的。我意识到,如果没有内联,因为这是在堆栈上分配的,这将是一件非常糟糕的事情。我们从未遇到过相关代码的问题,但我对此感到好奇。

6 个答案:

答案 0 :(得分:6)

不,不保证内联扩展。 inline仅仅是编译器的提示。

尽管如此,虽然res确实存在于堆栈中,但您会返回它的副本。如果不进行内联扩展,那将不是“非常糟糕的事情”。

答案 1 :(得分:2)

不,不能保证编译器会内联它。请参阅this answer

正如Strousoup在C ++编程语言中所说的那样

  

内联说明符是编译器的提示,它应该尝试生成代码内联,而不是为函数设置一次代码,然后通过通常的函数调用机制调用。

请注意关键字提示

答案 2 :(得分:2)

inline有两个目的,但只有一个是重要的。

正如其他人所说,暗示编译器应该内联函数的目的几乎是无用的。编译器在确定内联程序方面要比程序员好得多。

然而,重要的第二次使用(在您的情况下适用)是它打破了单定义规则(ODR)。也就是说,在正常情况下,链接器不得接受看到多次定义的符号。但是,如果该符号被声明为inline,则可以自由地假设每个符号的定义相同而忽略其余符号。

因为您的函数位于头文件中,所以它可能会在多个转换单元中定义,因此您需要中断ODR以允许您的代码编译而不会出错。

答案 3 :(得分:0)

允许编译器忽略inline关键字。如果不是inline这是非常糟糕的事情,那么你应该使用#define宏,或者使用适当的构造函数创建一个类(因为你已将其标记为C ++)等等。

答案 4 :(得分:0)

关于变量“在堆栈上分配”的函数的行为不会改变,无论它是否内联。因此,无论您遇到与堆栈相关的问题,它们在任何一种情况下都同样有效(或无效)。

答案 5 :(得分:0)

大多数编译器只有在开启优化时才真正内联。通常,您将使用源级调试器关闭优化以进行调试,并且通常此类调试器不能很好地使用内联代码,从而使调试更加困难。如果函数正常实现,则调试器不需要考虑内联。