【问题标题】:Is it possible to inline functions only with certain calls是否可以仅通过某些调用来内联函数
【发布时间】:2012-09-19 15:15:54
【问题描述】:

例如,如果我们有函数 A,是否可以告诉编译器,嘿,您需要在代码的这一点内联该函数,但此时不这样做(调用它)。

【问题讨论】:

    标签: c compiler-construction inline


    【解决方案1】:

    您不能选择性地告诉编译器内联某些调用,至少不可移植。

    请注意,inline 只是对编译器的建议,编译器可能会也可能不会遵循将函数体内联到调用点的建议,但某些条件,如 One definition rules 将被放宽此类函数的编译器。

    【讨论】:

      【解决方案2】:

      gcc 具有属性noinline 和always_inline。

      http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

      【讨论】:

        【解决方案3】:

        我认为这个要求没有用,你的问题的答案是:没有。

        但是,您可以通过使用宏来实现该效果:

        #define f_inline do { int i = 1 + 2; } while( 0 )
        
        void f() {
          f_inline;
        }
        

        如果您想强制内联应用f 的代码,现在可以使用f_inline;。

        【讨论】:

          【解决方案4】:

          你是否内联函数调用并不重要。见What does __inline__ mean ?。我只会编写非内联函数,让编译器决定如何以最佳方式内联它。

          【讨论】:

            【解决方案5】:

            如果编译器无条件地支持您使用或不使用inline 关键字,或者如果您使用gcc 扩展__attribute__((__always_inline__)) 和__attribute__(__noinline__)),那么您可以通过一个简单的包装函数实现您想要的:

            static inline int foo_inline(int a, int b)
            {
                /* ... */
            }
            
            static int foo_noninline(int a, int b)
            {
                return foo_inline(a, b);
            }
            

            我用inline 关键字编写了它,但由于编译器通常会将其视为提示甚至忽略它,因此您可能需要 gcc 属性版本。

            【讨论】:

              猜你喜欢
              • 2011-04-02
              • 2016-05-16
              • 1970-01-01
              • 2021-10-28
              • 1970-01-01
              • 2011-03-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多