叮当忽略属性内联
clang ignoring attribute noinline
我希望__attribute__((noinline))
添加到函数时,确保该函数被发出。这适用于 gcc,但 clang 似乎仍然内联它。
这里有一个例子,你也可以在Godbolt上打开:
namespace {
__attribute__((noinline))
int inner_noinline() {
return 3;
}
int inner_inline() {
return 4;
}
int outer() {
return inner_noinline() + inner_inline();
}
}
int main() {
return outer();
}
当用-O3
构建时,gcc 会发出inner_noinline
,但不发出inner_inline
:
(anonymous namespace)::inner_noinline():
mov eax, 3
ret
main:
call (anonymous namespace)::inner_noinline()
add eax, 4
ret
Clang坚持内联:
main: # @main
mov eax, 7
ret
如果向函数添加参数并让它们执行一些琐碎的工作,clang 会遵循 noinline 属性:https://godbolt.org/z/NNSVab
noinline 不应该独立于函数的复杂程度吗?我错过了什么?
__attribute__((noinline))
阻止编译器内联函数。它不会阻止它不断折叠。在这种情况下,编译器能够认识到没有必要调用inner_noinline
,无论是作为内联插入还是外联调用。它可以用常量3
替换函数调用。
听起来您想改用 optnone
属性,以防止编译器应用最明显的优化(就像这个一样)。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- C++概念:如何使用'concept'检查模板化结构的属性?
- 叮当不知道PTRDIFF_MAX?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- MacOS通过在莫哈韦"wchar.h"下破碎的自制啤酒发出叮当声
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 类的C++属性似乎已重新初始化
- Qt Quick-如何仅从c++代码与qml属性交互
- 用概念检查属性的类型
- C++如何将同一类的实例作为属性
- 如何以叮当格式设置评论的行长?
- 为什么 gcc 会产生这种奇怪的组件与叮当声?
- 按多个属性排序
- 主函数参数的属性
- "perf_event_attr"结构的"read_format"属性的选项到底是什么?
- C++删除未使用的类属性会导致 std::logic_error
- 叮当忽略属性内联
- 在可疑的情况下发出叮当警告:函数'foo'可以用属性"noreturn"声明吗?