gpt4 book ai didi

C++:array.size() 是循环的良好条件吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:22 25 4
gpt4 key购买 nike

如果有一个名为 arr 的 vector ,其中包含大量数据,我要打印该 vector 中的所有值。我要么使用:

int arr_size = arr.size();
for(int i=0; i<arr_size; ++i) {//print the values}

或者这样实现:

for(int i=0; i<arr.size(); ++i) {//print the values}

在我看来,第一种实现方式会将 vector 的大小提取到缓存中,从而使条件在第一次未命中后更快。第二次实现呢?是不是比较慢?每次满足条件时系统都会调用size()方法吗?

编辑:假设它正在使用 C++。

最佳答案

概括为具有任意主体的循环,您给出的两个变体之间存在一个关键区别:如果 arr 的大小在循环期间发生变化怎么办?

对于第二种情况,如果编译器可以假设它不会改变,那么它可以优化循环,所以 arr.size() 只被调用一次,生成的代码变成关于与第一种情况相同。

但是如果循环体调用了一个外部函数(极有可能),那么它就不能再做这个假设并且必须在每次循环迭代时检查 arr.size()

话虽如此,arr.size() 可能会产生一个简单的结构成员访问,这不会比将值存储在局部变量中慢,所以没有太多可做的无论如何都从使用第一个变体中获益。除非 arr 是一个指针或引用,在这种情况下它是一个间接访问,然后是一个访问,所以第一个版本将是 litte 更快。​​

如果它是一个特别常见的运行循环,并且出于某种原因您必须在没有优化的情况下进行编译,您可能希望使用第一种情况来加快速度。

但是那么,代码的可读性根本不会因为多一行而受到太大影响吗?

总而言之,除非循环是必须紧密的内部循环,否则我会选择变体 2,在这种情况下,我会选择变体 1 以确保万无一失。

当然,如果元素被添加到循环内的 arr 并且循环需要覆盖这些元素,那么只有第二个变体是正确的。

关于C++:array.size() 是循环的良好条件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10381761/

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