gpt4 book ai didi

c++ - 为什么在类实例化期间没有 CPU 消耗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:10:58 33 4
gpt4 key购买 nike

我创建了一个实例化类 10 亿次的循环,并且非常惊讶地看到它在 0 毫秒内运行并且根据 Windows 任务管理器没有消耗 CPU 时间。

正如您从下面的代码中看到的那样,我显然没有对默认构造函数执行任何操作,但我曾假设会一遍又一遍地创建然后销毁类,这会对 CPU 产生重大影响。有人可以解释为什么没有明显的 CPU 命中率吗?

class Cmytest {
public:
int lookup();
bool create_rec();
bool delete_rec();
};

void test() {
for (int i=0; i<1000000000; i++) {
Cmytest mytest;
}
}

int main()
{
test();
return 0;
}

运行上面的测试后,我想看看如果我在两个不同的线程中运行 test() 会发生什么(20 亿次迭代,但不包括代码以保持帖子简洁)并且没有明显的区别。

请指教,谢谢!

更新:

问这个的原因是因为我经常使用组合,而且我有一个类,其中有一个成员是 Cmytest。根据某些数据条件,Cmytest 的成员将被执行,而在其他情况下,它什么都不做。这是一个长时间运行的 Web 应用程序,我一直很关心效率。

最终更新:

我决定让实例做一些事情(以确保它不仅仅是优化以忽略什么都不做的循环)。我添加了以下成员,如下所示:

Cmytest::void count(int& i) {
i++;
}

然后我在循环中调用它:

int iter=0;
void test() {
for (int i=0; i<1000000000; i++) {
Cmytest mytest;
mytest.count(iter);
}
}

结果是 10 亿,如果在两个线程中运行,20 亿是正确的。由此,我只能推断工作正在完成并且对象正在被重用,这解释了我观察到的效率。

最佳答案

在“as-if 规则”下,允许编译器以任何它喜欢的方式转换您的程序,从而使可观察到的副作用保持不变 †。除了返回 0 之外,您的程序没有可观察到的副作用,因此几乎整个程序都可以解析为空。

即使我们忽略这一点,当在循环中声明一个对象时,编译器通常会一遍又一遍地重用同一个对象,而不必重新分配内存(但需要重新初始化对象)。在这个例子中,编译器甚至可以看到对象保持不变并且可以被重用而不必重新初始化它。无论如何,您的类无论如何都没有要初始化的状态。

为了演示,如果我在 Clang 中使用最大优化编译您的代码,test 函数的结果程序集如下所示:

_Z4testv:
.cfi_startproc
ret

它立即返回。

†​​ 复制省略是一种明确允许的优化,即使它确实修改了程序的可观察到的副作用。

关于c++ - 为什么在类实例化期间没有 CPU 消耗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24868976/

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