vector<int> f(const vector<int>& v)
{
vector<int> ret(v.size());
fill(ret.begin(), ret.end(), 123);
copy(v.begin(), v.end(), ret.begin());
return ret;
}
int main()
{
vector<int> v(10);
v = f(v);
}
Jeśli optymalizacja wartości zwracanej zostanie zastosowana do f, wówczas zmienna lokalna ret współużytkuje ten sam adres, co v w głównej. Ale jeśli jest to prawdą, wypełnienie ret powoduje wyrzucenie danych w v przed kopiowaniem. Kod jest poprawny bez RVO, a optymalizacje nie powinny naruszać zachowania.Jak to działa z optymalizacją wartości zwracanej?
Czy jest to bezpieczne, czy też nie rozumiem poprawnie instrukcji RVO?
Istnieją dwa różne rodzaje optymalizacji zwrotu: Kopia z 'ret' do tymczasowego, aby powrócić z' f', i kopia z tego tymczasowego do 'v'. Dozwolone jest tutaj tylko pierwsze. – dyp
Możliwe, że kompilator zoptymalizuje całą linię wypełnienia mimo wszystko. – OllieB
@OllieB Być może, ale to był tylko prosty przykład, który wymyśliłem. –