SORU
28 AĞUSTOS 2010, CUMARTESİ


Bir optimize uzakta "while(1);" C 0x içinde

Güncelleştirilmiş, aşağıya bakın!

C 0x yazdırmak için bir derleyici sağlayan duydum ve okudum "Merhaba", aşağıdaki kod için

#include <iostream>

int main() {
  while(1) 
    ;
  std::cout << "Hello" << std::endl;
}

Görünüşe göre konuları ve optimizasyon yetenekleri ile ilgisi var. Bu birçok insan olmasına rağmen bir sürpriz yapabilir bana öyle görünüyor.

Birisi bu izin için gerekli olduğunu neden iyi bir açıklama var mı? Başvuru için, en son C 0 x taslağı 6.5/5 diyor

Bir döngü bu ifade bir, durumda-ınit-deyimi dışında

  • G/Ç işlevleri kütüphane için arama yapar
  • veya geçici erişim nesneleri değiştirmez
  • yapar eşitleme işlemleri (1.10) veya atomik işlem (Madde 29)

sonlandırmak için uygulama tarafından kabul edilebilir. [ Not: Bu derleyici izin vermek için tasarlanmıştır transfor- mations, fesih kanıtlanmış olamaz bile boş döngüler, kaldırılması gibi. — son not ]

Düzenleme:

This insightful article bu Standartları metin hakkında diyor

Ne yazık ki, "tanımsız davranış" olarak kullanılır. bu kelimeler Ancak, her zaman standart "derleyici" özelliği-P olan bir program semantik tanımlanmamış. bu ima edilir P kabul edebilir diyor

Bu doğru mu, ve derleyici baskı "" yukarıdaki program? Bye izin verilir


Orada daha bir anlayışlı C, Adam başladı benzer bir değişim olan thread here, yukarıda bağlantılı makale bitti. Diğer yararlı bilgiler arasında, ayrıca C 0 x için geçerli gibi görünen bir çözüm sunarlar (GüncellemeBu artık n3225 - aşağıya bakın işe yaramaz!)

endless:
  goto endless;

Bir derleyici bir döngü, ama bir atlama olmadığı için uzak görünüyor, optimize etmek için izin verilmez. Başka bir adam C 0 x ve C201X önerilen değişiklik özetler

Bir döngü yazarak, programcı çalıştıklarını ifade ettiyabu döngü görünür davranış (g/Ç gerçekleştiren erişir bir şey yok uçucu nesneler, ya da bir eşitleme gerçekleştirir veya atomik işlemler), yasonunda sona erdirir. Eğer bu varsayım ihlal edersem hiçbir yan etkisi ile sonsuz bir döngü yazarak, yalan söylüyorum derleyici ve benim programın davranışı tanımsızdır. (Eğer ben şanslıyım, derleyici bu konuda beni uyardığı.) Dili sağlamaz (artık sağlar?) olmadan sonsuz bir döngüye ifade etmek için bir yol görünen davranış.


N3225 ile 3.1.2011 tarihinde güncelleme: Komite 1.10/24 metin taşındı ve söylüyorlar

Bu uygulama herhangi bir iş parçacığı sonunda aşağıdakilerden birini yapın varsayalım:

  • sonlandırabilir
  • O işlev/kütüphane için bir arama yapın
  • erişim veya değiştirme uçucu bir nesne, ya da
  • eşitleme işlemi veya atomik bir işlem gerçekleştirin.

goto hiledeğilartık işe!

CEVAP
28 AĞUSTOS 2010, CUMARTESİ


Benimle ilgili gerekçe:

Bu derleyici transfor - mations, fesih kanıtlanmış olamaz bile boş döngüler, kaldırma gibi izin vermek için tasarlanmıştır.

Muhtemelen, bu ispat fesih mekanik olmasıdırzorve yetersizlik kanıtlamak fesih engellemektedir Derleyiciler, bunun aksini yapmak yararlı dönüşümleri gibi hareketli nondependent operasyonlardan önce döngü sonra ya da tam tersi, gösteri sonrası döngü operasyonlarda bir iş parçacığı süre döngü yürütür, başka bir, ve benzeri. Bu dönüşümler olmadan, bir döngü bir iş parçacığı için dedi döngü bitirmek için beklerken diğer konuları engelleyebilir. ("İplik" gevşek ayrı BUYRUK talimat akışları da dahil olmak üzere paralel işleme herhangi bir şekilde.) demek için kullanıyorum

EDİT: Aptal örnek:

while (complicated_condition()) {
    x = complicated_but_externally_invisible_operation(x);
}
complex_io_operation();
cout << "Results:" << endl;
cout << x << endl;

Burada, diğer döngü içinde tüm karmaşık hesaplamalar yaparken bir iş parçacığı complex_io_operation yapmak için daha hızlı olurdu. Ama olmadan maddesi var dedi, derleyici var kanıtlamak için iki şey daha önce yapmak optimizasyonu: 1) complex_io_operation() bağlı değildir sonuçları döngü ve 2)döngü sona erecektir. İspat 1) oldukça kolay, ispat 2) durdurma sorunu. Maddesi ile, döngünün sona varsayalım ve bir parallelisation kazanmak olabilir.

Ben de tasarımcılar sonsuz döngü üretim kodu gerçekleştiği durumlarda çok nadirdir ve genelde olay kaynaklı gibi şeyler döngüler O tarz bir yer olarak hayal edin. Sonuç olarak, daha yaygın durumda (noninfinite, ama mekanik olarak noninfinite, döngüler kanıtlamak zor) optimize yana nadir davası (sonsuz döngü) pessimised var.

Ancak, sonsuz döngü öğrenme örneklerde kullanılan bir sonucu olarak yaşayacaktır anlamına gelir, ve Acemi kodu frikiklerinden yükseltecektir. Bu iyi bir şeydir tamamen söyleyemem.

EDİT: saygı anlayışlı makalede bağlantıyı şimdi, bunu "derleyici varsayalım X programı" mantıksal olarak eşdeğer "eğer program yok tatmin X, tanımsız davranıştır". Bu gösterebiliriz aşağıdaki gibidir: özellik X. Nerede bu program davranışı tanımlanmış olacaktır? tatmin etmeyen bir program var sanırım orada Standart tek davranış özelliği X doğru olduğunu varsayarsak tanımlar. Standart açıkça davranışı tanımsız ilan olmamasına rağmen, ihmal ederek, tanımlanmamış ilan etti.

Düşünün benzer bir argüman: "derleyici varsayalım bir değişken x, sadece atanan en fazla bir kez arasında sıra noktaları" eşdeğerdir "atama için x daha sonra sırası arasındaki puan tanımsız".

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrew_Huang

    Andrew_Huang

    10 ŞUBAT 2006
  • tseyina

    tseyina

    2 AĞUSTOS 2006
  • Vladimir Jenko

    Vladimir Jen

    1 Mart 2010