gpt4 book ai didi

C++ 用代码调用func和直接调用代码在性能上有什么区别吗? (来自 python )

转载 作者:行者123 更新时间:2023-12-05 05:37:07 28 4
gpt4 key购买 nike

我来自 Python,对 C++ 还是个新手。现在我想知道调用函数是否比调用 func 本身的代码在性能上更慢?

一些例子。

struct mynum {
public:
int m_value = 0;
constexpr
int value() { return m_value; }

// Say we would create a func here.
// That wants to use the value of "m_value"
// Is it slower to use "value()" instead of "m_value"?
// Even if the difference is very small.
// Or is there indeed no difference because everything gets compiled.
void somefunc() {
if(value() == 0) {}
}

}

最佳答案

如果函数体在调用时可用,编译器很可能会尝试自动将其内联(“inline”关键字只是一个提示)或将其保留为函数体。在这两种情况下,您可能都处于最佳路径,因为编译器非常擅长此类决策 - 或者比我们更好。

如果编译器只知道函数原型(prototype)(声明)并且主体在另一个编译单元(*.cpp 文件)中定义,那么您可能会遇到一些问题:

  1. 尽管处理器在过去 10 年左右的时间里在这些事情上变得非常高效,但处理器管道(和推测执行)可能会停止,这可能会调用您几个周期。甚至动态分支优化也变得如此出色,以至于没有必要像我们 20 年前那样重新排列顺序或 if/else(尽管对于微处理器来说仍然是必需的)。

  2. 寄存器优化将显示一个干净的切面,这将主要影响一些密集型计算。基本上,处理器运行优化来决定正在使用的变量将驻留在哪些寄存器中。当您进行调用时,只有其中几个会被保证保留,所有其他的都需要在函数返回时重新加载。如果事件变量的数量很大,加载/卸载会影响性能,但这种情况很少见。

  3. 如果函数是虚方法,则对虚表的间接查找可能会增加十个循环。如果编译器确切知道将调用哪个类,那么编译器可能会将调用去虚拟化,因此此成本实际上可能与普通函数相同。在更复杂的情况下,使用多层多态性,虚拟调用可能需要多达 20 个周期。在我的 2 层测试中,AMD Zen3(Threadripper)的成本平均为 5-7 个周期。

但总的来说,如果函数调用不是虚拟的,那么成本真的可以忽略不计。有些程序员发誓要内联所有内容,但如果我的经验值得一提的话,我已经以编程方式生成的代码 100% 内联,并且相同的代码单独编译,性能基本相同。

关于C++ 用代码调用func和直接调用代码在性能上有什么区别吗? (来自 python ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73181233/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com