性能缺乏我的C ++代码

时间:2014-07-07 07:25:56

标签: c++ performance

目前我正在尝试优化我的c ++代码以获得更好的性能,因为我有一个强大的java / c#背景。 我已经测试了类之间的getter / setter之类的简单示例,并使用它们实现了这样的引用:

vector<string>& MyClass::getNum()
{
   return num;
}

void MyClass::setNum(vector<string> &num)
{
   this->num = num;
}

(假设15+字符串在向量中)

比没有快2倍。 (使用简单/小参数时没有区别,但使用矢量等时会有很大差异。)

我也在Java中尝试过相同的例子,但不知何故,我的Java代码仍然比C ++更快。 有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:2)

在java中,一切都是指针,所以当你在java中执行此操作时:

void function (ArrayList <Integer> myList);

它在C ++中几乎相当于:

void function (std::vector <int> & myList);
void function (std::vector <int> * myList);

这回答了关于为什么Java在C ++中不使用引用时速度更快的问题,因为在大多数情况下引用速度更快。那么,为什么它会提高性能呢?

好吧,想象一下你有一个int向量,如果你将它传递给一个没有引用的函数,你必须复制一个对象(调用复制构造函数),这需要(通常)大量的时间因为你必须分配一个新的数组,等等结构的另一个例子:

struct X {
    int a[100] ;
    int b[100] ;
} ;

这个结构在现代机器上采用类似2 * 100 * 4 = 800字节的东西(当然可能会有所不同),所以如果你将它传递给类似的函数:

void function (X x) ;

当您调用该函数时,您需要复制一份800 bytes的副本,如果您这样做:

void function (X const& x) ;

你只传递一个对象的引用,即指向对象的东西,它将占用(在x64体系结构上)8个字节。

答案 1 :(得分:1)

this->num = num;:此行复制您通过引用传递的向量。如果您的目标是将矢量赋予MyClass然后忘记它,请考虑通过右值参考传递它并移动它。