C++11 Sağ değer referansları (R-value references) – 1

Sağ değer referansları C++11 standartlarıyla beraber gelen özelliklerden biridir. Temel olarak 2 faydayı amaçlamıştır:

1-Değer Kaydırma (Move Semantics)

2-Perfect Forwarding

Yazının ilerleyen kısımlarında bu konulara değineceğiz. Onun öncesinde ise sol değer, sağ değer ne demek dilerseniz önce ona bir göz atalım.

Bu kavramlar C dilinden miras alınmıştır. Kısaca tanımlarsak sol değer atama operatörünün sol kısmında bulunabilen değerlerdir. Sağ değer ise atama operatörünün sadece sağ kısmında bulunabilen değerlerdir. Örneğin;


int a;

a = 5;  // a bir sol değerdir.

int *b  = &a  // a bir sol değerdir operatör & argüman olarak sol değere ihtiyaç duyar.İfade geçerlidir.

string & foo(); // şeklinde string & döndüren bir fonksiyon olsun

foo() = "islam"; // foo nun geri dönüş değeri sol değer referansı olduğundan ifade geçerlidir.

string func();

func() = "islam"; //burda func'ın geri dönüş değeri geçici bir string nesnesidir bu nesneler ise sağ değerdir. Bunlara atama yapılamaz

a + 5 = 19 // burda da a + 5 ifadesi bir sağ değerdir. Çünkü + operatörünün geri dönüş değeri bu toplamın soınucudur(bu örnekte 10).

++a = 15 // ifade geçerlidir. Çünkü ++ operatörü geri dönüş değeri olarak a nesnesinin kendisini döndürür.Dolayısıyla atama geçerlidir.

Başka bir tanıma göre bellekte bir yer tahsis edilmiş değerlere veya değişkenlere sol değer, bellekte bir yer tahsis edilmemiş veya ismi  (identifier) olmayan değerlere de sağ değer denir.

Sağ değer Referansları

T türünden bir nesnenin (sol değer) referansını T& şeklinde gösteriyorduk, sağ değer referansını ise T&& şeklinde ifade edeceğiz.

Örneğin;


void foo(string &s)
{
cout << "sol değer referansı" << endl;
};

void foo(string &&s)
{
cout << "sağ değer referansı" << endl;
};

int main()
{
string s("cpp turkey user group");

foo(s); // sol değer referansı
foo(string("islam")); // sağ değer referansı
}

Aslında sağ değer referansları const referanslar olduğundan her ikisini birden yakalamak istiyorsak;

void foo(string const &s)
 {
 cout << "sağ-sol değer referansı" << endl;
 }

gibi bir fonksiyon implemente edersek her iki referans türünüde yakalacaktır. Fakat sağ değer referansını ayırt edemeyiz.

Değer Kaydırma (Move Semantics)

C++’ta şimdiye kadar nesnelerin atanmasında dilin tasarımı gereği bir nesnenin değeri diğer nesnenin bellekteki alanına kopyalanıyordu. Değer kaydırmadaki mantıkta ise bu değer kopyalanmıyor, nesne bu değerin bulunduğu bellek alanını gösteriyor. Böylelikle  kopyalama gibi maliyeti yüksek bir işlem yapılmadığından ciddi bir performans kazanımı oluyor.

Örneğin; Bir vector<string> dizinin başka bir diziye kopyalama maliyetini düşünün ctor ve dtor işlevlerinin maliyetini de kattığınızda devasa bir hesap ödemeniz gerekmektedir. Bu konuya devam edeceğiz.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s