vector
é uma estrutura com dois membros públicos X
e Y
; um construtor parametrizado que imprime integer constructor called
; um construtor de cópia que imprime copy constructor called
; e um construtor de movimento que imprime move constructor called <== This line is different\n
.
A função makeVectorx5y5IfNotZero()
retorna o vetor {5, 5}
se arg
for 0
. caso contrário, retorna {2, 2}
.
A main
função constrói vector A
usando makeVectorx5y5IfNotZero(1)
e constrói vector B
usando makeVectorx5y5IfNotZero(0)
.
Aqui está o código:
#include <iostream>
struct vector{
int X, Y;
vector(int X, int Y) : X(X), Y(Y){
printf("integer constructor called\n");
}
vector(const vector& other): X(other.X), Y(other.Y){
printf("copy constructor called\n");
}
vector(vector&& other): X(other.X), Y(other.Y){
printf("move constructor called <== This line is different\n\n");
}
};
vector makeVectorx5y5IfNotZero(bool Arg){
if(Arg){
vector A(0, 0);
A.X = 5;
A.Y = 5;
return A;
}
else {
vector B(1,1);
B.X = 2;
B.Y = 2;
return B;
}
}
int main(){
printf("Making Vector\n");
vector A = makeVectorx5y5IfNotZero(1);
printf("Made Vector\n");
printf("Making Another Vector\n");
vector B = makeVectorx5y5IfNotZero(0);
printf("Made Vector\n");
}
A saída deste código é:
Making Vector
integer constructor called
Made Vector
Making Another Vector
integer constructor called
move constructor called <== This line is different
Made Vector
No entanto, eu esperava o seguinte resultado, por causa do NRVO:
Making Vector
integer constructor called
Made Vector
Making Another Vector
integer constructor called
Made Vector
Por que a variável local B
de makeVectorx5y5IfNotZero()
está sendo movida para a variável local B
de main()
, em vez de apenas construir uma única variável no mesmo endereço de memória?
Versão do compilador (saída de g++ --version
):
g++ (Rev3, Built by MSYS2 project) 14.1.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Citando @PepijnKramer nos comentários
Isso é discutido mais detalhadamente neste vídeo C++ Weekly - Ep 456 - RVO + Tipos triviais = código mais rápido