2013-02-13 28 views
13

Std :: async kullanarak bir programı hızlandırmaya çalışıyorum. Diyelim ki, burada kopyalamanın pahalı bir türü olduğu yerlerde. Farklı bağımsız değişkenlerle birkaç bağımsız çağrım var ve bunları std :: async ile şu şekilde paralel hale getirmeye çalışıyorum: (m_futures bir std :: doğru türden futures vektörüdür).std :: async neden yapısını ve argümanlarını kopyalar?

for (...) { 
    m_futures.push_back (
     std::async(
      std::launch::async, 
      f, 
      a,b,c)); 
} 

Yukarıdaki kodun programımın yürütülmesini yavaşlattığını gözlemledim. Ben gdb ile adım attı ve geleceği oluşturulduğunda, T kopyası kopyacı üç kez denir. Neden? A, b, c argümanları tahsis edildi, ancak derleyici bu konuda bilmiyor mu? Bir şekilde bunu açıklayabilir miyim?

Her zaman std :: async, const başvuru tarafından geçirilmeleri gerekse bile argümanların kopyalarını yaratıyor mu? Bunu bir şekilde önleyebilir miyim? Saf aklımda, sadece işlevin farklı çağrışımlarına geçirilen bir işaretçi (sadece bellekten okuyan) olmalıdır. Eğer önemliyse Linux'ta gcc-4.6.3 kullanıyorum.

cevap

19

Veri ırkların yok olmasını garantileyen bir şey yok çünkü (daha derinden ve sadece varlığını nesnelerin @utapistim onu ​​ne yazık ki silinen yayında söylediği gibi,), sadece referansları depolamak için güvenli olmaz.

aslında Bir kopyası yerine bir başvuru istiyorsanız ve sen 'bu varlık doğru, o zaman basitçe kullanabileceği bir referans sargısı üzerine hayatını bahse istekli re: meraktan

std::async(std::launch::async, f, std::cref(a), std::cref(b), std::cref(c)) 
+1

, Arabirimi değiştirirsem ve bir işaretçiyi açıkça iletirsem? Bu, referans sarmalayıcıları kullanmaya eşdeğer olur mu? – Thomas

+0

@Thomas: Evet. Referans sarmalayıcılar * esasen işaretçilerdir. C++'da çıplak işaretçiler kullanmayın (özel sınıf üyeleri hariç). Referans sarmalayıcıları tercih edin. –

+0

Tamam, Teşekkürler, Referans sarmayı bilmedim. – Thomas

İlgili konular