在类的声明中直接写入函数的实现,缺省就会被视为内联函数(inline)的,例如:class MyClass
{
public:
   void print() { cout << i << ''; }  // Implicitly inline
private:
   int i;
};我的问题是:怎样写才能使这样写法的函数不是内联的呢?因为内联函数展开后会使编译后的代码迅速膨胀,我不希望这样的情况发生,但是我又有需要在类的声明中直接写入函数的实现,怎么办?
希望高手指点指点,谢谢!

解决方案 »

  1.   

    inline 只是对编译器的一个“建议”;编译器不一定会对这个函数进行内联展开;当成员函数是 virtual 的时候,是动态决定的,所以绝对不会内联展开.你可以试试在函数前加个virtual
      

  2.   

    不知道.
    不过并不是所有实现在类声明文件中的函数都是内联的,内联只是一个编译建议,如果函数实现中有复杂语句如switch...case,编译时会按照一般函数处理,从而不致编译后的可执行文件过于庞大。也就是说,如果你的函数代码比较多,编译时自然不按内联处理。
      

  3.   

    为什么需要在类的声明中直接写入函数的实现?没有任何意义。
    另外内联函数声明只是给编译器一个建议要求,编译器很可能会将inline声明
    的函数编译成非内联的。
    如果代码的大小对你来说很重要,合理的办法是将编译器的优化参数设置成最小大小
      

  4.   

    Inline是编译器的一个申明,但并不表示一定会编译成内联函数,具体,是否为内联函数由编译器来决定
      

  5.   

    #pragma auto_inline( [{on | off}] )Excludes any functions defined within the range where off is specified from being considered as candidates for automatic inline expansion. To use the auto_inline pragma, place it before and immediately after (not in) a function definition. The pragma takes effect at the first function definition after the pragma is seen. Pragma auto_inline does not apply to explicit inline functions.
      

  6.   

    就是因为内联函数是替换的方式,所以程序中用到该函数的地方越多,替换的地方就越多,编译之后的大小就会越大,特别是在内联函数中有常量字符串的时候,例如:inline bool IsCommand(const char *pcszInput)
    {
      if (strcmp(pcszInput, "show me the money") == 0)
      {
        return true;
      }
      else
      {
        return false;
      }
    }对于编译后的每一个地方,都会出现 "show me the money" 常量,这是要占内存的,同样也就是会使可执行程序膨胀的,如果去掉了内联,程序中就只有一份 "show me the money",这样程序就不会膨胀了。至于我为什么一定要在类的声明中直接写入函数的实现,我自然有我的需求,呵呵。不过问题解决了,就OK了。
      

  7.   

    内联函数既能够去除函数调用所带来的效率负担又能够保留一般函数的优点。然而,内联函数并不是万能药,在一些情况下,它甚至能够降低程序的性能。因此在使用的时候应该慎重。
        1.我们先来看看内联函数给我们带来的好处:从一个用户的角度来看,内联函数看起来和普通函数一样,它可以有参数和返回值,也可以有自己的作用域,然而它却不会引入一般函数调用所带来的负担。另外,它可以比宏更安全更容易调试。
     当然有一点应该意识到,inline specifier仅仅是对编译器的建议,编译器有权利忽略这个建议。那么编译器是如何决定函数内联与否呢?一般情况下关键性因素包括函数体的大小,是否有局部对象被声明,函数的复杂性等等。
        2.那么如果一个函数被声明为inline但是却没有被内联将会发生什么呢?理论上,当编译器拒绝内联一个函数的时候,那个函数会像普通函数一样被对待,但是还会出现一些其他的问题。