2014-07-03 50 views
7

Ana iş parçacığı üzerinde bazı statik verileri başlatmak istiyorum.Yan etkileri varsa fonksiyonlar optimize edilebilir mi?

int32_t GetFoo(ptime t) 
{ 
    static HugeBarData data; 
    return data.Baz(t); 
} 

int main() 
{ 
    GetFoo(); // Avoid data race on static field. 
       // But will it be optimized away as unnecessary? 

    // Spawn threads. Call 'GetFoo' on the threads. 
} 

Eğer suçlayıcı bunu kaldırmaya karar verebilirse, orada kalmaya nasıl zorlayabilirim?

+0

Derleyicileri yazan kişilerin, geri dönüş değerlerini attığınız için yan etkilere sahip olan işlev çağrılarını atmaya yetecek kadar akıllı olduklarını iyimser bir şekilde iyimserim. – meagar

+0

Standartın bazı ilgili bölümlerini takdir ediyorum. – Sam

+1

Amacınız ırk koşullarından kaçınmak ise (kaynak kodu yorumunda da belirtildiği gibi), ilk aramaya ihtiyacınız yoktur. C++ 11, yerel statik değişken başlatma için hiçbir yarış koşulunu garanti etmez (standardın önceki sürümleri, iplikler hakkında sessizdir). – Eugene

cevap

4

Derleyiciler "olarak eğer" kuralına göre optimize edilmelidir. Yani, herhangi bir optimizasyondan sonra, program, kodun optimize edilmemiş gibi davranmaya devam etmelidir (mantıklı anlamda).

Bir işlevin yan etkileri varsa, herhangi bir optimizasyon yan etkileri korumalıdır. Ancak, derleyici, yan etkilerin sonucunun programın geri kalanını etkilemediğini tespit ederse, yan etkileri bile en iyi duruma getirebilir. Derleyiciler bu alan hakkında oldukça muhafazakârdır. Derleyiciniz, HugeBarData yapıcısını veya programın başka bir yerinde gerekli olan Baz çağrısının yan etkilerini en iyi duruma getirirse, bu derleyicide bir hatadır.

Derleyicinin, genellikle kopyaları içeren, optimize edilmemiş durumdan programın davranışını değiştiren optimizasyonlar yapabileceği bazı istisnalar vardır. Bu istisnaların hiçbirinin burada geçerli olduğunu düşünmüyorum.

İlgili konular