内联的成员函数定义在.cpp文件中就不能铺展么

内联的成员函数定义在.cpp文件中就不能展开么?
同事说内联函数如果想展开就要一定定义在头文件中,不能定义在.cpp里。说是因为“内联时必须已经有了函数体才能做代码展开,如果函数定义在其它.cpp文件中编译的时候函数定义的代码就在其它obj文件里了,也就无法展开。”这么说对么?他还说“就算链接器有这么智能,能取其它OBJ里面取代码来内联,那么当只存在lib和dll没有obj文件的时候也是不能内联的”。请问他说的对吗?
网上看到很多关于内联的讹传,有的甚至被大家认为是法则,比如“内联函数里不能有循环,有了就不能展开”什么的,所以希望大家能拿出真凭实据,比如可以引用C++标准的文档,或者用某些代码来实验。

------解决方案--------------------
C++的标准行为需要

1.inline写在定义上而不是声明上
2.inline函数写头文件而不是源文件

但目前大多数编主流译器,都是可以将cpp文件内的函数展开的,只要你是从源码编译的,能找到源码实现就行

对于二进制连接时的优化展开(将obj、lib中的函数内联展开,dll中目前还没有谁能做到),属于链接时优化,目前还远不如编译时优化成熟,但VC、icc也都是能做的(gcc不确定,没研究过)

编译器发展到今天,inline关键字已经退居二线,类似于register关键字,绝大部分情况下并没有一定得用的必要,本身inline和register都属于“建议而非强制”、“性能相关而非功能相关”,他们所做的事情本就不应该有程序员干预,而应该是编译器优化做的事情,换句话说inline和register是在编译器不够智能的时代的人为干预优化。

目前的主流编译器,可以做到即便你不写inline,适合内联的函数也会内联,正如你不写register,编译器也会尽量使用寄存器而非堆栈一样的道理
------解决方案--------------------
+1 inline只是建议,至于实不实现是编译器的事
引用:
C++的标准行为需要

1.inline写在定义上而不是声明上
2.inline函数写头文件而不是源文件

但目前大多数编主流译器,都是可以将cpp文件内的函数展开的,只要你是从源码编译的,能找到源码实现就行

对于二进制连接时的优化展开(将obj、lib中的函数内联展开,dll中目前还没有谁能做到),属于链接时优化,目前还远不如编译时优化成熟,但VC、icc也都是能做的(gcc不……

------解决方案--------------------
引用:
引用:

综上, 循环可以展开内联, 内联可以放在.h中 类结束后实现。 内联不能放在cpp中实现, 否则编译通过,连接失败

的确写上inline的话会造成链接失败。
cpp中的函数不能加上inline,但编译器会依据某些标准,内联其他cpp中实现的函数。


确实如此,我的错误
------解决方案--------------------
c++标准N1905中:
Every program shall contain exactly one definition of every non-inline function or object that is used in that program; no
diagnostic required. The definition can appear explicitly in the program, it can be found in the standard or a user-defined
library, or (when appropriate) it is implicitly defined (see 12.1, 12.4 and 12.8). An inline function shall be defined in
every translation unit in which it is used.

最好一句讲的很清楚。 但是inline的函数定义可以放在cpp中,只是其它编译单元无法使用这个函数,仅限在cpp内部使用。 放在头文件中的inline函数,可以再不同的cpp中使用(或展开)


------解决方案--------------------

intel C++ 编译器

编译器参数
inline-forceinline
   Specifies that an inline routine should be inlined whenever the compiler can do so.

Because C++ member functions whose definitions are included in the class declaration are considered inline functions by default, using this option will also make these member functions "forceinline" functions.

When you use this option to change the meaning of inline to "forceinline", the compiler may do so much additional inlining that it runs out of memory and terminates with an "out of memory" message.


finline-limit
inline-max-per-compile
------解决方案--------------------
去看herb sutter 的《exceptional c++》系列,大概一共3论Inline
其中有足够解答楼主的信息。
herb sutter的话,可比我们这些混混权威多了。
这个问题,即使是扣标准也是解答不了的。
------解决方案--------------------
其实我觉得标准说的挺清楚的,c++11 3.2/3 说
An inline function shall be defined in every translation unit in which it is odr-used.

所以 inline function 必然只能定义在头文件里面,因为这样才能够通过 #include 将其定义,而非仅仅是声明,包含进目标 translation unit 里面。非得写在 cpp 里面也行,但是就得像 #29 说的,#include 该 cpp 文件了,不过这样用 cpp 的话,本质上也就是将其用作 .h 文件了。#18 的例子程序中因为 main.cpp 只包含了 test.h,所以在 main 里面只能看到 test::fun 的声明,而看不见定义,因此会导致链接错误,此例子展示了 3.2/3 的意思。