1

在 C++ 中,可以使用inline关键字将函数定义为内联。就像程序员要求编译器在每个调用函数的地方插入完整的函数体一样。

但据我所知,编译器没有义务尊重这一要求。那么有没有办法保证一个函数是内联的呢?

4

6 回答 6

8

没有。实际上内联一个函数是一个完整的实现细节,很多函数是不能内联的。这使得内联强制机制的存在成为不可能。在某些情况下,即使提供诸如__forceinline(VC++)之类的关键字的编译器也不会使用该限定符内联函数。该页面对滥用此限定词进行了非常恰当的警告。

于 2012-07-11T09:57:38.343 回答
5

__forceinline在 VC++ 和__attribute__((always_inline))g++ 中使用

于 2012-07-11T10:00:18.657 回答
3

由于标准未涵盖此内容,因此取决于您使用的编译器。编译器的文档将告诉您是否有强制内联函数的功能,以及如何使用它。文档还应该告诉您该功能的限制,例如非尾部位置的递归调用。

于 2012-07-11T09:56:56.047 回答
1

如果您使用的是 Microsoft 编译器,则可以使用 __forceinline,如下所述:http: //msdn.microsoft.com/en-us/library/z8y1yy88%28v=vs.71%29.aspx

我不知道在 g++ 或其他编译器中强制内联的方法。

于 2012-07-11T09:57:17.690 回答
1

通过将函数的定义直接放入头文件中的声明中,该函数获得内联的机会最高。

class TheClass
{
public:
    static void DoSomething () // declaration
    {
        // the function's code (definition) goes here
    };
};

// in the same header..

void DoOtherThings () // declaration
{
    // the function's code (definition) goes here
}

在任何情况下,都没有强有力的保证,即使您使用编译器特定的关键字进行内联强制也是如此。

100% 的保证是将您的函数转换为 C++ 宏并使用宏而不是引用该函数。如果您的函数有多行,\请在“宏函数”中要换行的位置放置一个(空格后跟反斜杠)。

于 2012-07-11T10:00:31.367 回答
1

我无法想象有办法做到这一点。它主要依赖于编译器。另一种解决方案是使用#define 宏来定义您的函数

于 2012-07-11T10:01:08.637 回答