问题标签 [inlining]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4032 浏览

c++ - 内联调用不太可能失败并且代码大小会增加 [-Winline] 但不使用内联

对 C++ 来说非常新。

这是我的用户定义的 fmiNode 类:(fmi.h)

这是我的主要方法(fmi.c)

如果我只实例化一个 fmiNode 对象,一切都很好。但以下 3 会导致引发警告:

我在这里做错了什么。

编辑:

所以我应该这样定义我的类:?

干杯,里斯

0 投票
0 回答
316 浏览

clang - Clang 禁用内联 getelementptr

我有以下简单的 c 代码。

现在clang为此案例生成的IR如下。

如图所示,getelementptr 指令内联在加载指令内部。有没有办法在clang中禁用这种内联?我正在使用 clang 3.8.0 版。

0 投票
2 回答
116 浏览

c++ - 内联和死代码删除优化可以防止模板实例化吗?

给出以下示例代码

GCC 正确报告以下内容:

我现在的问题是:这种有保证的行为是否在标准或任何其他文件中有一些规定?

更准确地说我的问题:

C是一个模板类,它的成员只有在被引用f()g()才会被实例化。f()中引用main()。如果我不引用g()(它在内部尝试使用不完整的类型),则代码将编译。但是g()在 if-branch inside 中被引用f()。这个分支确定性地永远不会被执行。因此编译器可能会忽略/删除这个死代码分支,从而避免实例化g()(以及尝试使用不完整类型的错误)。但是,这并没有发生(至少在我尝试过的编译器上)。

我知道允许这样做只会通过调整编译器的优化设置将非法代码变成合法代码,但我的问题仍然是这个代码示例是否由于某些规则(例如优化顺序与模板传递)而保证失败可以在某处阅读。

感谢您的任何见解。

0 投票
2 回答
410 浏览

c# - 是否可以在 C# 中进行内联以优化字符串连接?

假设您有这样的 C# 代码:

此类代码由编译器优化,因此结果变量中有一个常量字符串文字“ABC:XYZ”,而不是在运行时实际连接 3 个字符串。

现在我想介绍一个辅助函数,它将对用户隐藏该连接(以使代码更健壮且不易出错):

在这种情况下,我看到该方法实际上是内联在调用方法中的,但在反汇编中我可以清楚地看到它string.Concat(string a, string b, string c)在运行时调用,而不是有一个常量字符串文字“ABC:XYZ”。

我知道在编译过程中速度和质量之间存在平衡,但是有什么技巧可以让该Combine方法作为 C++ 宏工作以避免在运行时出现多余的字符串连接?

PS 引入只计算一次的静态只读字符串并不是问题的答案。

0 投票
3 回答
147 浏览

c++ - 是否保证只有一个非内联内联函数的副本?

如果我声明一个大函数内联,并且编译器无论如何都选择将其编译为独立函数,那么是否保证程序中只有该非内联内联函数的一个副本,或者编译器最终可能会创建多个非内联函数- 这个函数在不同翻译单元中的内联副本?

或者,以一种几乎肯定会引起咬牙切齿的方式重新表述:在不考虑预处理时间的情况下,在头文件中定义一个内联的大型方法是一种能够重用该代码而无需在单独的翻译单元中编译/链接?

0 投票
1 回答
573 浏览

.net - 将 MethodImplOptions.AggressiveInlining 应用于 F# 函数

该属性System.Runtime.CompilerServices.MethodImplAttribute可用于向 JIT 编译器提供有关如何处理修饰方法的提示。特别是,该选项MethodImplOptions.AggressiveInlining指示编译器在可能的情况下内联受影响的方法。不幸的是,F# 编译器在生成 IL 时似乎只是忽略了这个属性。

示例:以下 C# 代码

被翻译成

注意“aggressiveinlining”标志。

然而,这个 F# 代码

变成

没有“积极的内联”。我还尝试将该属性应用于适当类的静态和非静态方法(type ...),但结果是相同的。

但是,如果我将它应用于自定义索引器,就像这样

得到的 IL 是

...虽然我不确定这是否等同于 C# 编译器生成的“aggressiveinling”标志。

这种行为是期望/预期的吗?它是 F# 编译器中的错误吗?

(注意:我知道 F#inline关键字,但这仅适用于我的库的 F# 客户端,而不适用于 C# 消费者。)

0 投票
1 回答
284 浏览

javascript - 自动javascript函数内联

这是一个关于现代 javascript 引擎中 JIT 编译器的典型行为的问题。假设我有一个包含许多字段的 A 类,其中的实例在另一个 B 类中大量使用,包括在循环中。与其公开 A 的内部,还有一堆单行访问方法。单独来看,每种方法对性能的影响不大,但让我们假设它们共同产生很大的影响。现代 JIT 会内联这些功能吗?

0 投票
3 回答
5457 浏览

c++ - 函子实际上比函数指针快吗?

根据 Scott Meyers 的说法,C++ 优于 C 的一个方面是函数对象比函数指针更快。他说这是因为函数对象是内联的,这提高了速度。

我对此有两个问题:

  1. 我们如何验证函数对象实际上是内联的?我们可以在实践中验证这一点吗?

  2. 函数对象的内联是否取决于我们使用的编译器,还是所有编译器的行为都如此?

0 投票
1 回答
55 浏览

c++ - C ++内联 - 什么是“正确”的方式

我在互联网上搜索了很多 C++ 内联,但似乎每个人都喜欢不同的实现方式。

我的问题如下所示:

由于这个函数getI()被调用了几千次,我认为“内联”这个函数很有用。这样做的最佳方法是什么:

你能给我一个提示,哪种方式是最好的或最高效的实现方式?感谢帮助 :)

0 投票
1 回答
1550 浏览

c++ - __forceinline 和内联用法

在类中使用 __forceinline 或 inline 时,是否必须在 MSVC 的头文件中包含定义?我听说过不同的编译器对此有不同的看法。

示例 1:

示例 2: