9 Aralık 2019 Pazartesi

Return Value Optimization

Giriş
Return Value Optimization (RVO) iki çeşittir.
1. Unnamed RVO
2. Named RVO

RVO sayesinde "Move Constructor" bile çağrılmaz.

Named RVO'nun gerçekleşmesi için bazı kurallar var.
1. Metodun döndürdüğü tip ile dönülen nesnenin tipi aynı olmalı
2. Nesne automatic storage kullanmalı. Yani stack'te yaratılmalı.
3. Nesne metodun parametresi olmamalı

C dilinde de RVO vardır. Ancak dil içinde copy constructor, destructor gibi şeyler olmadığı için RVO gözlemlenemez.

Eğer bu özelliği kapatmak istersek şöyle yaparız
g++ -fno-elide-constructors main.cpp

C++17
Açıklaması şöyle. RVO C++17'den itibaren tam anlamıyla çalışmaya başladı.
...in C++17 there is a guaranteed RVO. In C++14 statements like Foo x = Foo(args) and Foo x (args) are technically not the same, but they are in C++17.

1. RVO Nedir?
Metod geçici bir nesne döndürür. Şuna benzer.
Bar foo() {
  return Bar();
}
2. Named RVO Nedir?
Named RVO yazısına taşıdım. 

3. RVO Girdi Parametrelere Uygulanmaz
a parametresi input olduğu için copy elision uygulanmaz. Yani 2 numaralı kural ihlal edilemez.
X f(X a) {
 return a;
}

Hiç yorum yok:

Yorum Gönder