用命令行显示出来的
Microsoft (R) COFF/PE Dumper Version 10.00.30319.01Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file 2nDs_Vector2D.obj
File Type: COFF OBJECT
COFF SYMBOL TABLE000 00AB766F ABS notype Static | @comp.id001 00000001 ABS notype Static | @feat.00002 00000000 SECT1 notype Static | .drectve Section length 41, #relocs 0, #linenums 0, checksum 0 Relocation CRC 00000000005 00000000 SECT2 notype Static | .debug$S Section length B98, #relocs 0, #linenums 0, checksum 0 Relocation CRC 00000000008 00000000 SECT3 notype Static | .debug$T Section length 94, #relocs 0, #linenums 0, checksum 0 Relocation CRC 00000000
String Table Size = 0x0 bytes
Summary
B98 .debug$S 94 .debug$T 41 .drectve 哦,知道了,象
void _2nDs_Vector2D::Set(float fx, float fy)
{
x = fx;
y = fy;
}
这种只赋值的函数不要用inline,以后你编译时,哪个函数找不到,就把哪个函数的inline标识去掉。
总之,inline省着点用吧,不一定能提高性能的,每个函数都加一个,终于出问题了。 内联函数还有这个毛病呢???这是什么原理。非常感谢shawind大 也没见过有人特意说inline有这个问题。我一般是模仿hge中的用法,像:
inline void System_SetState(hgeBoolState state, bool value)
{
System_SetStateBool(state, value);
}
所以我也从来就不知道inline居然还有这毛病,这是排查出来的。
不过再看看《c++ primer plus》 中说的,inline是让“编译器使用相应的函数代码替换函数调用。”
也就是说,被inline修饰的函数中,应该包含有另外一个函数。
因此只是写得简短,而并没有调用其他的函数的函数,将其内联是没有任何意义的。
没用就算了,居然还会出错。这真是太奇妙了。vc开了/w4都不提醒,真是的。 非常感谢非常感谢!!!!!!我自己弄了好久完全没思路 内联函数的链接问题,在我头脑里也不甚清晰,只知道声明和定义要放在一个头文件里,还是"强化"一下:
引用c++标准N1905:
inline的函数定义可以放在cpp中,只是其它编译单元无法使用这个函数,仅限在cpp内部使用。 放在头文件中的inline函数,可以在不同的cpp中使用(或展开)
就是说调用内联函数的地方一定要能看到这个内联函数的定义,
你可以测试一下,你不要在main.cpp里调用这个内联函数,你就在2nDs_Vector2D.cpp里去调用,你会发现,他能链接成功,
或者你直接在main.cpp里再加上一句:#include "2nDs_Vector2D.cpp"这样也能链接成功.
这说明什么? 很明显,只要链接器在他所链接的obj里找不到内联函数的定义,他就会报错!
所以,最好是把内联函数的声明和定义写在头文件里,因为从来都是包含.h文件的,没有人去包含cpp文件.头文件被包含了,那内联函数在其所在的obj里不就可见了吗!
对于class,成员函数写在类体里,在最大优化(release)的情况下,都是当做内联函数用的,所以都不用加inline
另外,你也可以反想一下,如果内联函数的声明和定义可以分开写,那么c++的stl就不会把他的实现部分暴露出来.
引用别人的一段话:
编译器发展到今天,inline关键字已经退居二线,类似于register关键字,绝大部分情况下并没有一定得用的必要,本身inline和register都属于“建议而非强制”、“性能相关而非功能相关”,他们所做的事情本就不应该有程序员干预,而应该是编译器优化做的事情,换句话说inline和register是在编译器不够智能的时代的人为干预优化。
目前的主流编译器,可以做到即便你不写inline,适合内联的函数也会内联,正如你不写register,编译器也会尽量使用寄存器而非堆栈一样的道理 这个解说很祥尽,非常受益。 LSSV587!!!!!!
页:
1
[2]