我正在网上解决一个练习,有一次我需要从字符串的开头和结尾删除“”。这是我的代码:
void static inline process_value(std::string &value) {
if (value.back() !='>') {
value = value.substr(1, value.size()-2);
}
}
从此基准循环调用:
static void UsingStatic(benchmark::State& state) {
// Code inside this loop is measured repeatedly
for (auto _ : state) {
std::string valor("\"Hola\"");
process_valueS(valor);
// Make sure the variable is not optimized away by compiler
benchmark::DoNotOptimize(valor);
}
}
仅出于好奇心我did a benchmark。
[当时我决定从static
中删除process_value
,使void inline process_value
与此相同。令我惊讶的是,它变慢了。
我认为静态仅表示该功能仅用于文件。但是here表示““静态”表示如果可能,编译器应内联函数”。但是在那种情况下,当我删除static时,我认为结果应该不会改变。现在我很困惑,除了将函数分隔为单个.cpp
之外,static还会做什么其他事情,这对性能有何影响?
[QuickBench上的反汇编显示,尽管NoUsingStatic
关键字使编译器这样做合法,但process_value
循环实际上调用了inline
而不是对其进行内联。但是UsingStatic
does内联到process_valueS
的呼叫。编译器决策上的差异可能解释了性能上的差异,但是为什么clang选择不内联声明为void inline process_value(std::string &value){ ... }
的简单函数?
编辑:因为该问题由于不清楚而被关闭,所以我删除了与该问题无关的部分。但是,如果我缺少一些信息,请在评论中告诉我
我正在网上解决一个练习,有一次我需要从字符串的开头和结尾删除“”。这是我的代码:void static inline process_value(std :: string&value){...
Clang使用基于成本的决策来决定是否内联函数。这笔费用受很多因素影响。受static
的影响。
inline
只是对编译器的建议,它可能会或可能不会真正内联您的特定代码。