以下代码段编译没有问题,即使foo
是内联定义的,但没有这样声明,并且bar
被声明为内联但未如此定义。
int foo();
inline int foo() { return 3; }
inline int bar();
int bar() { return 4; }
inline int foobar();
inline int foobar() { return 5; }
int main(){
// ...
}
我的第一个问题: 编译器是否读取foo
内联与否?关于什么bar
?这是 C++ 标准指定的吗?
我的第二个问题:以下哪一项是声明和定义内联函数的最佳实践?是吗foo
? bar
? or foobar
? Why?
inb4 我读了一些与此相关的其他帖子,但没有一个直接回答我的问题。
This答案似乎表明foo
是内联的,但什么也没说bar
。也没有解释why foo
比其他人更受欢迎。This答案讨论了我何时应该使用内联函数。这不是我关心的:我已经决定使用内联函数。我的问题(准确地说是问题 2)是我是否应该这样声明它、定义它,或者两者兼而有之,以及为什么其中一个约定比其他约定更好。This问题似乎更接近我的担忧,但没有人回答。
对于成员函数来说是正确的,对于非成员函数没有明确定义(我相信)
请参阅 ISO C++ 标准中的 §10.1.6。
内联说明符只能应用于声明或
变量或函数的定义
and
带有内联说明符的函数声明(11.3.5、12.2.1、14.3)声明内联函数。
它没有明确说明如果内联说明符仅修改函数的定义会发生什么。
我们可以确定的是such member函数保证被标记为内联(感谢詹姆斯·柯兰)。
参见第 12.2.1 节。
内联成员函数(无论是静态还是非静态)也可以是
在其类定义之外定义,只要其
类定义中的声明或其定义之外
类定义将函数声明为 inline 或 constexpr。
GCC 和非成员情况下的所有三个职能
与海湾合作委员会一样-O1
C++模式,提到的每个函数都是内联的。
Code:
#include "stdio.h"
int foo();
inline int foo() {int i; for(i=0;i<100000;i++); return i+3; }
inline int bar();
int bar() {int i; for(i=0;i<100000;i++); return i+4; }
inline int foobar();
inline int foobar() {int i; for(i=0;i<100000;i++); return i+5; }
int foobar2();
int foobar2() {int i; for(i=0;i<100000;i++); return i+6; }
int main(){
int a,b,c,d;
a=foo();
b=bar();
c=foobar();
d=foobar2();
printf("%d %d %d %d", a, b, c, d);
}
Disassembly:
![IDA](https://i.stack.imgur.com/UccLs.png)
我们只能看到foobar2
叫做。
As in -O2
and -O3
, inline
没关系。编译器将自行决定(在上面的情况下,所有 4 个函数都是内联的)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)