Copy elision will do the job just fine. Even a C++03 compiler will elide the temporary.
In particular, NRVO (named return value optimization) will, for this code,
MatrixXd foo()
{
MatrixXd huge_matrix(N,N);
return huge_matrix;
}
MatrixXd A = foo();
construct huge_matrix
right inside A
. The C++03 standard specifies in [class.copy]/15:
This elision of copy operations is permitted in the following
circumstances (which may be combined to eliminate multiple copies):
- in a
return
statement in a function with a class return type, when the expression is the name of a non-volatile automatic object with the same cv-unqualified type as the function return type, the
copy operation can be omitted by constructing the automatic object
directly into the function’s return value
- when a temporary class object that has not been bound to a reference (12.2) would be copied to a class object with the same
cv-unqualified type, the copy operation can be omitted by constructing
the temporary object directly into the target of the omitted copy
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…