类inline成员函数,我一直的写法竟然是错的,悲剧

zhangwuji156 2012-07-19 04:26:28
今天想了一个函数,应该是用inline的,看MFC里的一个函数差不多,就看了一下MFC实际它的代码,果然不出我所料,是inline的。但令我没想到的 是,inline关键字写在了函数实现那里

比如
class aaa
{
int get();
}
inline int aaa::get()
{}

而我,一直是
class aaa
{
inline int get();
}
int aaa::get()
{}
赶紧搬出来effective C++看了一下,就是上面那样。这……令我如何是好,那我那种写法,含意是什么?
...全文
261 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xunxun 2012-07-19
  • 打赏
  • 举报
回复
我觉得内联汇编给内联是应该的,除非函数体太大
jackyjkchen 2012-07-19
  • 打赏
  • 举报
回复
Intel编译器更狠,曾经把我几百行的内嵌汇编函数给内联了
jackyjkchen 2012-07-19
  • 打赏
  • 举报
回复
比如“只调用一次的私有函数”,内联基本不会有什么副作用,为什么不内联,即便你不加inline,VC、gcc、icc在打开某些编译选项的情况下都会给你内联的

C语言现在也有inline关键字,Linux内核社区曾经为“只调用一次的static函数(相当于C++的私有函数)该不该显式使用inline”的问题讨论过,结论就是“不需要加,编译器能帮你搞定”

VC的inline、forceinline等关键字实际的作用也就是降低了内联的判定条件,你不加任何东西,编译器认为该内敛的还是会内联(前提是使用/Ob2选项,印象中release版本默认打开的)
zql1982000 2012-07-19
  • 打赏
  • 举报
回复
c++ 是一次编译的,所以理论上实现最好写在h文件里面。
而我一直是这样写的,
class aaa
{
inline int get(){}
}
实际上这样写的比较多。lz那样写的貌似比较少。
一般我只有在写模板的时候才像楼主那样做。
jackyjkchen 2012-07-19
  • 打赏
  • 举报
回复
实际上你放声明哪里,对于现代化的编译器,也可能内联,你什么都不加,仍然可能内联

因为内联本身就是个建议而已,决定权在编译器,在现代化编译器拥有足以自行判断是否应该内联的情况下,这个关键字,其实已经没什么用了,你可以在编译器中禁止inline之外的函数内联,提供一种细化控制,但大部分时候都没什么用(除非嵌入式中内存过于紧张,需要防止编译器擅自内联造成额外内存开销)

C++ Primer对内联函数的另一个说法——内联函数必须写在头文件,让调用者都能看见。该说法对于许多编译器也是不适用的,编译器既然能通过声明找到实现,那么函数放CPP里,其他的CPP调用的时候一样能找到实现

彭家老三 2012-07-19
  • 打赏
  • 举报
回复
不是在函数定义或原型前加inline都可以吗?
oN5GrzoN 2012-07-19
  • 打赏
  • 举报
回复
竟然还有人存在这种想法……
实现部分直接写在类申明里的成员函数,才默认是inline的
[Quote=引用 1 楼 的回复:]

类的成员函数默认就是inline吧
[/Quote]
翅膀又硬了 2012-07-19
  • 打赏
  • 举报
回复
类的成员函数默认就是inline吧

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧