- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我问这个基本问题是为了让记录更正。已转介 this question和 its currently accepted answer ,这没有说服力。然而second most voted answer提供更好的洞察力,但也不完美。
在阅读下文时,请区分 inline
关键字和“内联”概念。
这是我的看法:
内联概念
这样做是为了节省函数的调用开销。它更类似于宏样式代码替换。没什么好争论的。inline
关键词
知觉A
The
inline
keyword is a request to the compiler usually used for smaller functions, so that compiler can optimize it and make faster calls. The Compiler is free to ignore it.
inline
关键词。 inline
是什么,优化器都会自动内联较小的函数。关键字是否被提及。 inline
的函数内联没有任何控制权。 .
inline
has nothing to do with the concept of inlining. Puttinginline
ahead of big / recursive function won't help and smaller function won't need it, for being inlined.The only deterministic use of
inline
is to maintain the One Definition Rule.
inline
声明的那么只有以下事情是强制性的:
.cpp
文件中包含该头文件),编译器也只会生成 1 个定义并避免多个符号链接(symbolic link)器错误。 (注意:如果该函数的主体不同,则它是未定义的行为。)inline
的 body 函数必须在使用它的所有翻译单元中可见/可访问。换句话说,声明一个 inline
函数在 .h
并在任何一个中定义 .cpp
文件将导致其他 .cpp
的“ undefined symbol 链接器错误”文件 最佳答案
我不确定你的主张:
Smaller functions are automatically "inlined" by optimizer irrespective of inline is mentioned or not... It's quite clear that the user doesn't have any control over function "inlining" with the use of keyword
inline
.
inline
要求,但我不认为他们完全无视它。
inline
关键字确实使 Clang/LLVM 更有可能内联函数。
inline
在
the Clang repository导致 token 说明符
kw_inline
.看起来 Clang 使用了一个聪明的基于宏的系统来构建词法分析器和其他与关键字相关的函数,所以有像
if (tokenString == "inline") return kw_inline
这样的直接注释。被发现。但是
Here in ParseDecl.cpp ,我们看到
kw_inline
结果是拨打
DeclSpec::setFunctionSpecInline()
.
case tok::kw_inline:
isInvalid = DS.setFunctionSpecInline(Loc, PrevSpec, DiagID);
break;
inline
:
if (FS_inline_specified) {
DiagID = diag::warn_duplicate_declspec;
PrevSpec = "inline";
return true;
}
FS_inline_specified = true;
FS_inlineLoc = Loc;
return false;
FS_inline_specified
在其他地方,我们看到它是位域中的一个位,并且
it's used in a getter function ,
isInlineSpecified()
:
bool isInlineSpecified() const {
return FS_inline_specified | FS_forceinline_specified;
}
isInlineSpecified()
的调用站点,我们找到
the codegen ,我们将 C++ 解析树转换为 LLVM 中间表示:
if (!CGM.getCodeGenOpts().NoInline) {
for (auto RI : FD->redecls())
if (RI->isInlineSpecified()) {
Fn->addFnAttr(llvm::Attribute::InlineHint);
break;
}
} else if (!FD->hasAttr<AlwaysInlineAttr>())
Fn->addFnAttr(llvm::Attribute::NoInline);
inline
说明符被转换为与语言无关的 LLVM 的属性
Function
目的。我们从 Clang 切换到
the LLVM repository .
llvm::Attribute::InlineHint
yields the method
Inliner::getInlineThreshold(CallSite CS)
(带有一个看起来很可怕的无腕带
if
块):
// Listen to the inlinehint attribute when it would increase the threshold
// and the caller does not need to minimize its size.
Function *Callee = CS.getCalledFunction();
bool InlineHint = Callee && !Callee->isDeclaration() &&
Callee->getAttributes().hasAttribute(AttributeSet::FunctionIndex,
Attribute::InlineHint);
if (InlineHint && HintThreshold > thres
&& !Caller->getAttributes().hasAttribute(AttributeSet::FunctionIndex,
Attribute::MinSize))
thres = HintThreshold;
HintThreshold
,我们把它撞了。 (HintThreshold 可从命令行设置。)
getInlineThreshold()
似乎只有
one call site ,
SimpleInliner
成员(member):
InlineCost getInlineCost(CallSite CS) override {
return ICA->getInlineCost(CS, getInlineThreshold(CS));
}
getInlineCost
, 在其指向
InlineCostAnalysis
实例的成员指针上.
::getInlineCost()
要查找属于类成员的版本,我们会找到属于
AlwaysInline
的版本。 - 这是一个非标准但被广泛支持的编译器功能 - 另一个是
InlineCostAnalysis
的成员.它使用它的
Threshold
参数
here :
CallAnalyzer CA(Callee->getDataLayout(), *TTI, AT, *Callee, Threshold);
bool ShouldInline = CA.analyzeCall(CS);
CallAnalyzer::analyzeCall()
超过 200 行和
does the real nitty gritty work of deciding if the function is inlineable .它权衡了许多因素,但是当我们阅读该方法时,我们看到它的所有计算要么操纵了
Threshold
或
Cost
.最后:
return Cost < Threshold;
ShouldInline
真的是用词不当。实际上
analyzeCall()
的主要目的是设置
Cost
和
Threshold
CallAnalyzer
上的成员变量目的。返回值仅指示其他因素覆盖成本与阈值分析的情况,
as we see here :
// Check if there was a reason to force inlining or no inlining.
if (!ShouldInline && CA.getCost() < CA.getThreshold())
return InlineCost::getNever();
if (ShouldInline && CA.getCost() >= CA.getThreshold())
return InlineCost::getAlways();
Cost
的对象。和
Threshold
.
return llvm::InlineCost::get(CA.getCost(), CA.getThreshold());
getInlineCost()
的这个返回值在哪里?用过的?
bool Inliner::shouldInline(CallSite CS)
.另一个大功能。它调用
getInlineCost()
就在一开始。
getInlineCost
分析内联函数的内在成本——它的参数签名、代码长度、递归、分支、链接等——以及有关使用该函数的每个地方的一些聚合信息。另一方面,
shouldInline()
将此信息与有关使用该功能的特定位置的更多数据相结合。
InlineCost::costDelta()
的调用。 - 将使用
InlineCost
s
Threshold
由
analyzeCall()
计算出的值.最后,我们返回一个
bool
.决定作出。在
Inliner::runOnSCC()
:
if (!shouldInline(CS)) {
emitOptimizationRemarkMissed(CallerCtx, DEBUG_TYPE, *Caller, DLoc,
Twine(Callee->getName() +
" will not be inlined into " +
Caller->getName()));
continue;
}
// Attempt to inline the function.
if (!InlineCallIfPossible(CS, InlineInfo, InlinedArrayAllocas,
InlineHistoryID, InsertLifetime, DL)) {
emitOptimizationRemarkMissed(CallerCtx, DEBUG_TYPE, *Caller, DLoc,
Twine(Callee->getName() +
" will not be inlined into " +
Caller->getName()));
continue;
}
++NumInlined;
InlineCallIfPossible()
内联基于
shouldInline()
的决定。
Threshold
受到
inline
的影响关键字,最后用来决定是否内联。
inline
更改了其优化行为。关键词。
inline
只是一个提示,其他因素可能会超过它。
关于c++ - "inline"关键字与 "inlining"概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27042935/
看看这个 fiddle http://jsfiddle.net/9S4zc/2/ 为什么这在 firefox 和 chrome 中看起来不同(文本对齐方式不同) 如何让 inner:before 元素
我从文档中了解到的是 %{ %} 之间的内容。被插入到包装器中,%inline %{ %} 呢? ? 是一样的吗?如果不是,有什么区别? 也许我们可以找到很多%inline %{ %}的出现。但仅出现
当我使用 显示:inline-flex; 或 显示:内联网格; 似乎有一些额外的“空间”或某种额外的重点计算发生。我不确定到底发生了什么。当使用箭头键在 contentediatble div 中导航
如果我想让一个 div 与容器 div 的其他内联元素内联,而我的目的仅此而已,我应该更喜欢使用 inline-block 或 display property 还是 inline-flex?不能使用
这个问题在这里已经有了答案: Why does an inline-block align to top if it has no content? (2 个答案) 关闭 8 年前。
Ada 信息交换所 states the following : The use of pragma Inline does have its disadvantages. It can create
Name
我问这个基本问题是为了让记录更正。已转介 this question和 its currently accepted answer ,这没有说服力。然而second most voted answer
你好, 在管理面板中,我创建了用于添加产品的表单。表单包括 2 个内联表单集,因为有一些与产品相关的模型。用户可以创建产品,然后定义该产品的不同属性的变体。我将举例说明这一点。用户拥有一个品牌的 3
有很多关于 inline 的使用以及如何正确执行此操作以达到所需目的的信息,例如此处(我目前将其用作引用)Inline Functions in C . 当我尝试实现页面中指定的内容时,出现编译器错误
我正在编写 gtk 代码。我经常有不需要闭包的简短回调,因为它们传递了它们需要的所有参数。例如,我在创建一些 gtk.TreeViewColumns 时将其置于循环中: def widthChange
这个问题在这里已经有了答案: What is the difference between display: inline and display: inline-block? (7 个答案) 关闭
我已经搜索了很长时间来找到答案,但是我没有找到解决方案... 我制作了一个无序列表的链接,并将它们放在标题下,就像导航栏一样。然而,在 IE 中(是的那个恶魔..)我的链接似乎没有对齐到中间。下面是我
我想将两张 table 并排放置。由于我不是 floating 或使用“css hacks”的忠实拥护者,您有什么建议?没有它是否可以解决,还是我运气不好? 最佳答案 使用 table-cell显示以
这个问题在这里已经有了答案: Why is this inline-block element pushed downward? (8 个答案) 关闭 6 年前。
CSS display 的 inline 和 inline-block 值到底有什么区别? 最佳答案 视觉答案 想象一个 中的元素.如果你给 例如,元素高度为 100px 和红色边框,它看起来像这
我想使用 /纯 CSS 弹出窗口的标签,但是 表现为内联 block ,我无法将其更改为内联。 有没有办法强制表现得像 display:inline 而不是 inline-block?
我的想法是这是不可能的,或者我缺少一个额外的步骤。无论哪种方式,我都被卡住了,无法弄清楚。 使用内联模板的原因是能够使用 Laravel Blade 语法并结合 Vue Js 的强大功能。似乎是两者中
http://christianselig.com/wp/ 对于主导航,如果我使用 display: inline,它们将显示为 block 。我心血来潮添加了 display: inline-blo
Firefox 的 -moz-inline-box 和 -moz-inline-stack 专有显示值有什么区别? 最佳答案 https://developer.mozilla.org/en/CSS/
我是一名优秀的程序员,十分优秀!