在类方法中,我正在访问私有属性-或嵌套类的属性。而且,我正在遍历这些属性。

我想知道在以下时间和内存方面最有效的方法是:


复制属性并在循环内访问它们
在循环中访问属性
或者也许在属性上使用迭代器


我觉得我的问题与Efficiency of accessing a value through a pointer vs storing as temporary value有关。但就我而言,我只需要访问一个值,而不需要更改它。



给定两个班

class ClassA
{
 public:
       vector<double> GetAVector() { return AVector; }

 private:
       vector<double> m_AVector;
}




class ClassB
{
 public:
    void MyFunction();

 private:
    vector<double> m_Vector;
    ClassA m_A;
}


I.我应该做:

1。

void ClassB::MyFunction()
{
    vector<double> foo;
    for(int i=0; i<... ; i++)
    {
         foo.push_back(SomeFunction(m_Vector[i]));
    }
    /// do something ...
}


2。

void ClassB::MyFunction()
{
    vector<double> foo;
    vector<double> VectorCopy = m_Vector;
    for(int i=0; i<... ; i++)
    {
         foo.push_back(SomeFunction(VectorCopy[i]));
    }
    /// do something ...
}


3。

void ClassB::MyFunction()
{
    vector<double> foo;
    for(vector<double>::iterator it = m_Vector.begin(); it != m_Vector.end() ; it++)
    {
         foo.push_back(SomeFunction((*it)));
    }
    /// do something ...
}


二。如果我没有遍历m_vector而是m_A.GetAVector()怎么办?

附言:我在阅读其他文章时了解到,起初进行“微”优化没有用,但是我的问题更多地与实际发生的事情和应该做的事情有关-就标准(和编码样式)而言

最佳答案

您很幸运:您实际上可以自己解决所有问题,方法是在编译器上和操作系统上尝试每种方法,然后对每种方法进行计时以了解所需时间。

这里没有通用的答案,它适用于存在于太阳第三颗行星上的所有可以想象的C ++编译器和操作系统。每个编译器和硬件都不同,并且具有不同的运行时特性。甚至同一编译器的不同版本也常常会导致不同的运行时行为,从而可能影响性能。更不用说各种编译和优化选项。而且,由于您甚至都没有指定编译器和操作系统,因此在这里几乎没有权威性的答案。

尽管确实可以对此类问题进行高度确定性的最佳实现,但对于大多数用例而言,这并不是其中之一。获得答案的唯一方法是自己尝试每个备选方案,进行概要分析并比较结果,然后自己找出答案。

关于c++ - C++-循环效率:存储类成员的临时值与指向该成员的指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37835399/

10-11 19:06