目前我正在尝试优化我的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 ++更快。 有人可以帮帮我吗?
答案 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
然后忘记它,请考虑通过右值参考传递它并移动它。