我的c++代码缺乏性能

Performance Lack in my C++ Code

本文关键字:性能 代码 c++ 我的      更新时间:2023-10-16

目前我正试图优化我的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++快。有人能帮我吗?

在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个字节。

this->num = num;:这一行复制了您通过引用传递的向量。如果您的目标是将向量提供给MyClass,然后忘记它,请考虑通过右值引用传递它并移动它。