是否有可能强制一个函数不内联?

我想强制一个小函数不被编译为内联函数,即使它非常简单。 我认为这对于debugging目的很有用。 有没有关键字来做到这一点?

在Visual Studio 2010中, __declspec(noinline)告诉编译器不要内联特定的成员函数,例如:

 class X { __declspec(noinline) int member_func() { return 0; } }; 

编辑:此外,使用/clr编译时,具有安全属性的函数永远不会被内联(再次,这是VS 2010特有的)。

尽pipe如此,我认为这不会对debugging有用。

__declspec(noinline)为VC ++。 相反的手册页,这似乎是独立的function,我不认为我曾经使用它的成员function。 你可以 – 尽pipe注意到我从来没有 – 也想考虑玩优化标志,所以只有inline函数被认为是内联的,当然这有一个全局的效果,可能不是你想要的。

__attribute__((noinline))为gcc(和一些不常见的编译器,支持gcc属性语法)。 我必须承认,我不认为我曾经使用这个,但似乎在那里。

(当然,这两种注解的方式都在不同的地方,所以构造两者都适用的代码有点麻烦)。

我不知道这些如何与inline C ++关键字交互。 我只在debugging时使用它们(当我只是想让一个特殊的非内联函数在优化后没有内联时)或者在检查生成的代码时(因为随机内容被内联而变得困惑)。

请记住内联与函数调用站点相关,在某些情况下可以内联相同的函数,而不是内联。

如果你的函数在编译单元之外是可见的,那么即使它在所有当前使用的地方被内联,函数的主体仍然可以被任何想要稍后调用的人使用(通过链接到目标文件)。

为了使呼叫站点不内联,可以使用指向函数的指针。

 void (*f_ptr)(int); // pointer to function volatile bool useMe = true; // disallow optimizations if (useMe) f_ptr = myFunc; else f_ptr = useOtherFunc; f_ptr(42); // this will not be inlined 

简单:不要让编译器看到函数的定义。 那么它不可能被内联。 当然,只有它代码才有效。

当涉及到debugging第三方代码…是的,这将是有用的,尤其是如果你可以从远方赶走第三方代码。 任何debugging了包含大量shared_ptr解引用的代码的人都知道我在说什么。

许多编译器可以执行交叉翻译单元内联。 Visual Studio已经有五年了,我相信GCC现在可以做到这一点 – 特别是自从OP被标记为Visual C ++之后,他的编译器可以应付这个公平的赌注。

最简单的方法是获取函数的地址,然后做一些非意义的操作,比如调用它,或者将它传递给OS / external library函数。 编译器不能内联那种function。

为什么你会想要,IDK。

@注释:

如果OP很简单,需要这个,那么他可以把它编译成一个lib并静态链接到它。

如果它是一个类的成员函数,使其虚拟。

你可以在类头文件和cpp文件之间划分类的实现。 如果你把这个函数放在类定义的外面,你的小函数将不会内联。

是否有可能强制一个函数不内联?

我甚至不会试图回答这个问题,因为除了下面列出的两个原因之外,关心这个问题是无关紧要的。

内联基本上是

  1. 一个对你来说最为透明的优化
  2. 一种允许在头文件中定义函数而不会出现多重定义错误的方法

(有些人会改变这两个的顺序,但我坚持传统的顺序。)

除非A)你绝对需要在某个头文件中定义一个函数,或者B)你正在分析和优化一段代码,并且比编译器知道什么应该被内联和什么不应该内联,内联应该是你不关心的。
由于debugging当然不应该担心。 你的debugging器应该(并且在VC的情况下)为你照顾。