使用`static`如何影响我的代码速度?

问题描述 投票:6回答:2

我正在网上解决一个练习,有一次我需要从字符串的开头和结尾删除“”。这是我的代码:

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

  • Compiler: Clang-9.0
  • std: c ++ 20
  • optim: O3
  • STL: libstdc ++(GNU)

[当时我决定从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){...

c++ performance static clang benchmarking
2个回答
5
投票

Clang使用基于成本的决策来决定是否内联函数。这笔费用受很多因素影响。受static的影响。


0
投票

inline只是对编译器的建议,它可能会或可能不会真正内联您的特定代码。

© www.soinside.com 2019 - 2024. All rights reserved.