inline 绝对是C++里最让人混淆的关键词之一了(比static还过度)。ios
============== Update 30 Nov 2016函数
看其余评论里有提到static 的。我的评价一下 static + inline 一块儿:那就是把死人往活里搞,活人往死里搞的赶脚,坑之深简直不忍直视。先上追加的3个结论;后面有代码,有耐心的小伙伴们拿回去本身试。优化
3. 谨慎使用 static:若是只是想把函数定义写在头文件中,用 inline,不要用static。static 和 inline 不同:4. static inline 函数,跟 static 函数单独没有差异,因此没有意义,只会混淆视听。this
5. inline 函数的定义不必定要跟声明放在一个头文件里面:定义能够放在一个单独的头文件 .hxx 中,里面须要给函数定义前加上 inline 关键字,缘由看下面第 2.点;而后声明 放在另外一个头文件 .hh 中,此文件include 上一个 .hxx。这种用法 boost里很常见:优势1. 实现跟API 分离,encapsulation。优势2. 能够解决 有关inline 函数的 循环调用问题:这个不展开说了,看一个这个文章就懂了:Headers and Includes: Why and How 第 7 章,function inlining。spa
Reference: inline specifierblog
============== 原答案30 Nov 2016ip
1. 不要再把 inline 和编译器优化挂上关系了,太误导人。编译器不傻,inline is barely a request。你不加inline,小函数在开O3时,编译器也会自动给你优化了。看到inline时,应该首先想到其余用意,在考虑编译器优化。ci
2. inline最大的用处是:非template 函数,成员或非成员,把定义放在头文件中,定义前不加inline ,若是头文件被多个translation unit(cpp文件)引用,ODR会报错multiple definition。get
============== static / inline 代码编译器
#ifndef A_HH # define A_HH # include <iostream> namespace static_test { static int& static_value() // (!*!) Or change this to inline { static int value = -1; return value; } namespace A { void set_value(int val); void print_value(); } } #endif
# include "a.hh" namespace static_test { namespace A { void set_value(int val) { auto& value = static_value(); value = val; } void print_value() { std::cout << static_value() << '\n'; } } }
#ifndef B_HH # define B_HH # include <iostream> namespace static_test { namespace B { void set_value(int val); void print_value(); }; } #endif
# include "a.hh" # include "b.hh" namespace static_test { namespace B { void set_value(int val) { auto& value = static_value(); value = val; } void print_value() { std::cout << static_value() << '\n'; } } }
# include "a.hh" # include "b.hh" int main() { static_test::A::set_value(42); static_test::A::print_value(); static_test::B::print_value(); static_test::B::set_value(37); static_test::A::print_value(); static_test::B::print_value(); return 0; }