关于内联函数
书上都说内联函数是把被调用函数体代码直接插入到该函数被调用处,而不是通过call语句进行,没有了参数压栈,出栈等函数调用开销,
下面这个程序,我在vc6.0下看了下汇编,怎么还是call语句调用内联函数,参数压栈,寄存器压栈,然后返回,各位大侠给指点下!
#include <iostream>
#include <string>
using namespace std;
class Point
{
int i, j, k;
public:
Point(): i(0), j(0), k(0) {}
Point(int ii, int jj, int kk)
: i(ii), j(jj), k(kk) {}
void print(const string& msg = " ") const
{
if(msg.size() != 0) cout < < msg < < endl;
cout < < "i = " < < i < < ", "
< < "j = " < < j < < ", "
< < "k = " < < k < < endl;
}
void test(int ii) {i=ii;}
};
int main()
{
Point p, q(1,2,3);
————————这句的汇编代码————————————————
004015D3 8D 4D E8 lea ecx,[ebp-18h]
004015D6 E8 83 FB FF FF call @ILT+345(Point::Point) (0040115e)
004015DB 6A 03 push 3
004015DD 6A 02 push 2
004015DF 6A 01 push 1
004015E1 8D 4D DC lea ecx,[ebp-24h]
004015E4 E8 AD FA FF FF call @ILT+145(Point::Point) (00401096)
——————————————————————————————————
p.print( "value of p ");
q.print( "value of q ");
cout < < sizeof Point < <endl;
q.test(2);
__________________________________________________
0040164F 6A 02 push 2
00401651 8D 4D DC lea ecx,[ebp-24h]
00401654 E8 18 FC FF FF call @ILT+620(Point::test) (00401271)
_________________________________________________
return 0;
} ///:~
[解决办法]
哪本书上说inline一定内联了?inline关键字只是“建议”编译器把这个函数内联。
另外,你看的汇编是不是debug版啊?debug版本来就不太会真正内联的,因为那将给程序的debug带来一些麻烦。
[解决办法]
C++里面的内联函数主要是为了提升程序的效率~
inline关键字只是“建议”编译器把这个函数内联~
对于过大的函数进行内联不一定能提高程序的效率反而增加其负担~
[解决办法]
恩, 是建议内联的, 而且跟编译器的设置有关