我正在用类似 C 的语言编写代码,并且正在使用一个inline
实际上倾向于内联的函数。但是,根据编译器添加的调试信息(例如,GCC 添加的 DWARF),内联会维护该函数源中的位置。
是否可以让编译器内联函数的代码,同时将指令归因于内联函数的行?
为了讨论起见,假设我正在编写 C++ 并在 Linux 上使用 GCC 进行编译(尽管更一般的答案值得赞赏。)
(动机与分析有关,您只对您所在的函数进行采样,但不对整个堆栈进行采样。)
我正在用类似 C 的语言编写代码,并且正在使用一个inline
实际上倾向于内联的函数。但是,根据编译器添加的调试信息(例如,GCC 添加的 DWARF),内联会维护该函数源中的位置。
是否可以让编译器内联函数的代码,同时将指令归因于内联函数的行?
为了讨论起见,假设我正在编写 C++ 并在 Linux 上使用 GCC 进行编译(尽管更一般的答案值得赞赏。)
(动机与分析有关,您只对您所在的函数进行采样,但不对整个堆栈进行采样。)
artificial
function 属性执行以下操作:
artificial
此属性对于小型内联包装器很有用,如果可能的话,它们应该在调试期间作为一个单元出现。根据调试信息格式,它要么意味着将函数标记为人工,要么将调用者位置用于内联体内的所有指令。
指令的放置__attribute__
有点棘手。这是推荐的地方:
inline void __attribute__ ((artificial))
increment (int &i)
{
++i;
}
这与 C++ 语法中的地方不同:
[[gnu::artificial]]
inline void
increment (int &i)
{
++i;
}
该artificial
属性被 Clang 和从它派生的编译器识别。