今天学习了MD5算法的C源码,里面的几个关键函数是用宏定义的。
因为看过Effective C++,作者建议用内联函数代替宏定义的函数,所以我就写了个相应的版本。
inline UINT32 F(UINT32 x, UINT32 y, UINT32 z) { return (((x) & (y)) | ((~x) & (z))); }
inline void FF(UINT32 &a, UINT32 b, UINT32 c, UINT32 d, UINT32 x, UINT32 s, UINT32 ac)
{
a += F(b, c, d) + x + (UINT32)ac;
a = ROTATE_LEFT(a, s);
a += b;
}
但是我用Ollydbg调试了一下,发现生成的汇编代码并没有展开,还是call形式的,到网上查了一下,有网友说inline只是建议编译器进行展开处理,并不是强制的。
我又用了__forceinline关键字,但发现还是不能展开。
请问如何强制内联呢?
我使用的编译器是VC++ Express 2012
c++ 内联函数 inline
------解决方案--------------------------------------------------------
把优化选项打开,查查有没一个控制展开规模的选项,如果有的话,设一个比较大的值。
一定要确保强制内联就用宏好了。任何事都是有利有弊,适合需求就好。
------解决方案--------------------------------------------------------
inline为优化而生,如果不开优化,是不会做展开的,即使开了优化,也需要编译器觉得展开有利而且能够展开,才会展开。
------解决方案--------------------------------------------------------
http://msdn.microsoft.com/en-us/library/19z1t1wy%28v=vs.71%29.aspx
------解决方案--------------------------------------------------------
-O3 试试