在类的声明中直接写入函数的实现,缺省就会被视为内联函数(inline)的,例如:class MyClass
{
public:
void print() { cout << i << ''; } // Implicitly inline
private:
int i;
};我的问题是:怎样写才能使这样写法的函数不是内联的呢?因为内联函数展开后会使编译后的代码迅速膨胀,我不希望这样的情况发生,但是我又有需要在类的声明中直接写入函数的实现,怎么办?
希望高手指点指点,谢谢!
{
public:
void print() { cout << i << ''; } // Implicitly inline
private:
int i;
};我的问题是:怎样写才能使这样写法的函数不是内联的呢?因为内联函数展开后会使编译后的代码迅速膨胀,我不希望这样的情况发生,但是我又有需要在类的声明中直接写入函数的实现,怎么办?
希望高手指点指点,谢谢!
不过并不是所有实现在类声明文件中的函数都是内联的,内联只是一个编译建议,如果函数实现中有复杂语句如switch...case,编译时会按照一般函数处理,从而不致编译后的可执行文件过于庞大。也就是说,如果你的函数代码比较多,编译时自然不按内联处理。
另外内联函数声明只是给编译器一个建议要求,编译器很可能会将inline声明
的函数编译成非内联的。
如果代码的大小对你来说很重要,合理的办法是将编译器的优化参数设置成最小大小
{
if (strcmp(pcszInput, "show me the money") == 0)
{
return true;
}
else
{
return false;
}
}对于编译后的每一个地方,都会出现 "show me the money" 常量,这是要占内存的,同样也就是会使可执行程序膨胀的,如果去掉了内联,程序中就只有一份 "show me the money",这样程序就不会膨胀了。至于我为什么一定要在类的声明中直接写入函数的实现,我自然有我的需求,呵呵。不过问题解决了,就OK了。
1.我们先来看看内联函数给我们带来的好处:从一个用户的角度来看,内联函数看起来和普通函数一样,它可以有参数和返回值,也可以有自己的作用域,然而它却不会引入一般函数调用所带来的负担。另外,它可以比宏更安全更容易调试。
当然有一点应该意识到,inline specifier仅仅是对编译器的建议,编译器有权利忽略这个建议。那么编译器是如何决定函数内联与否呢?一般情况下关键性因素包括函数体的大小,是否有局部对象被声明,函数的复杂性等等。
2.那么如果一个函数被声明为inline但是却没有被内联将会发生什么呢?理论上,当编译器拒绝内联一个函数的时候,那个函数会像普通函数一样被对待,但是还会出现一些其他的问题。