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
C++17
Açıklaması şöyle. RVO C++17'den itibaren tam anlamıyla çalışmaya başladı.
1. RVO Nedir?
Metod geçici bir nesne döndürür. Şuna benzer.
Named RVO yazısına taşıdım.
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.
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.
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