Re: Don't pass by reference to non-const?
On 05/ 9/10 11:39 AM, Thomas J. Gritzan wrote:
Am 08.05.2010 17:43, schrieb Balog Pal:
"James Kanze"<james.kanze@gmail.com>
I love it when people comment about things they know nothing
about.
.... or fail to read minds auto-correcting misleading forum comments?
The compiler can't always use RVO. Our two versions were:
std::vector<double> v(...);
for (... lot's of iterations ... )
{
// calculate some values based on the current contents
// of v.
v = some_function(... the calculated values ...);
// ...
}
as opposed to
std::vector<double> v(...);
for (... lot's of iterations ... )
{
// calculate some values based on the current contents
// of v.
some_function(&v, ... the calculated values ...);
// ...
}
In this example you clearly use the vector as INOUT parameter, and have
a performance gain from that fact. Originally we were talking about OUT
parameters...
No. The performance gain comes from the fact that he only allocates
memory once and uses this memory for all iterations.
It's the same with std::getline (in a loop), where the output string's
capacity grows to the maximal line length at some time, and then there's
no more allocation unless you copy the strings.
That is true, but it's interesting how close the two approaches are in
performance when that factor is removed. Comparing case 1:
std::vector<std::vector<double> > v(loops);
for( int n = 0; n < loops; ++n )
{
fn1(v[n]);
double d = v[n][4999];
}
with case 2:
std::vector<std::vector<double> > v(loops);
for( int n = 0; n < loops; ++n )
{
v[n] = fn2();
double d = v[n][4999];
}
Where f1 and f2 are:
void fn1( std::vector<double>& v ) {
for( int i = 0; i < 1000000; ++i ) v.push_back( 42.0*i );
}
std::vector<double> fn2() {
std::vector<double> v;
for( int i = 0; i < 1000000; ++i ) v.push_back( 42.0*i );
return v;
}
I see 3.73 seconds for case 1 and 4.07 seconds for case 2.
--
Ian Collins