可以强制不内联函数吗?

我想强迫一点函数不要编译为内联函数,即使它非常简单。 我认为这对于调试目的很有用。 有没有关键字可以做到这一点?

Thomson asked 2020-02-13T19:30:18Z
8个解决方案
50 votes

在Visual Studio 2010中,/clr告诉编译器从不内联特定成员函数,例如:

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

编辑:此外,在使用/clr进行编译时,永远不会内联具有安全属性的函数(同样,这特定于VS 2010)。

不过,我认为它根本不会对调试有用。

Michael Foukarakis answered 2020-02-13T19:30:44Z
43 votes

适用于VC ++的inline。 与手册页相反,这似乎适用于独立功能,而且我认为我从未将它用于成员函数。 您可能-尽管要注意我从来没有-还要考虑使用优化标志,以便仅考虑inline函数进行内联,尽管这当然具有全局作用,并且可能不是您想要的。

适用于gcc的inline(以及许多不常见的支持gcc属性语法的编译器)。 我必须承认,我认为我从未真正使用过它,但是它似乎在那里。

(当然,这两种样式的注释在不同的地方使用,因此构造对两者都适用的代码有点烦人。)

我不确定这两个如何与inline C ++关键字交互; 我只在调试时(当我只想让特定的非内联函数在优化后不内联时)或在检查生成的代码时才使用它们(由于内联随机性,所以我感到困惑)。

answered 2020-02-13T19:31:19Z
13 votes

请记住,内联与函数调用站点有关,在某些情况下可以内联同一函数,而在其他情况下则不能内联。

如果您的函数在编译单元外部可见,那么即使在使用它的所有当前位置都内联了该函数,该函数的主体对于以后想要调用它的任何人(通过与目标文件链接)仍然必须可用。

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

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
Motti answered 2020-02-13T19:31:48Z
4 votes

简单:不要让编译器看到函数的定义。 这样就无法内联。 当然,这仅在您的代码有效时有效。

是的,在调试第三方代码时...是的,这将很有用,尤其是当您可以远距离交换第三方代码时。 任何调试了包含大量shared_ptr取消引用的代码的人,都知道我在说什么。

John answered 2020-02-13T19:32:14Z
2 votes

许多编译器可以执行跨翻译单元内联。 Visual Studio已经使用了五年,我相信GCC现在可以做到这一点-特别是因为OP被标记为Visual C ++,这是他的编译器可以应对的一个不错的选择。

最简单的方法是获取函数的地址,然后对它执行无意义的操作,例如调用它或将其传递给OS /外部库函数。 编译器无法内联这种功能。

为什么您会想要,IDK。

@注释:

如果OP srsly,srsly需要此操作,则他可以将其编译为lib并静态链接到它。

Puppy answered 2020-02-13T19:32:51Z
0 votes

您可以在头文件和cpp文件之间划分类实现。 如果将函数放在类定义之外,则小函数将不会内联。

LostMohican answered 2020-02-13T19:33:12Z
0 votes

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

Jan Boonen answered 2020-02-13T19:33:31Z
-12 votes

是否可以强制不内联函数?

我什至不会尝试回答这个问题,因为除了下面列出的两个原因之外,与这个问题无关。

内联基本上是

  1. 对您几乎透明的优化
  2. 一种允许在标头中定义函数而不会出现多个定义错误的方法

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

除非A)您绝对需要在某些标头中定义一个函数,否则B)您正在对代码进行概要分析和优化,并且比编译器更了解应该内联什么,不应该内联什么,内联对于您而言应该无关紧要 。
由于调试,它当然不应该成为问题。 您的调试器应该(对于VC也是如此)为您解决这一问题。

sbi answered 2020-02-13T19:34:23Z
translate from https://stackoverflow.com:/questions/3329214/is-it-possible-to-force-a-function-not-to-be-inlined