我在工作中经历了一些代码,我发现了这个
inline
FLAGS get_flags(void) {
FLAGS res;
memset(&res, 0, sizeof(res));
return res
}
这是在程序中包含的头文件中声明的。我意识到,如果没有内联,因为这是在堆栈上分配的,这将是一件非常糟糕的事情。我们从未遇到过相关代码的问题,但我对此感到好奇。
答案 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)
大多数编译器只有在开启优化时才真正内联。通常,您将使用源级调试器关闭优化以进行调试,并且通常此类调试器不能很好地使用内联代码,从而使调试更加困难。如果函数正常实现,则调试器不需要考虑内联。