SORU
23 EKİM 2014, PERŞEMBE


Farklı fonksiyonlar farklı Adres var mı?

Bu iki işlevi göz önünde bulundurun:

void foo() {}
void bar() {}

&foo != &bar Bunun garantisi var mı?

Aynı şekilde

template<class T> void foo() { }

&foo<int> != &foo<double> bunun garantisi var mı?


Birlikte işlev tanımları kat biliyorum iki bağlayıcı vardır.

Agresif COMDAT kıvrımlar fonksiyonları MSVC, aynı uygulama ile iki işlevi bir fonksiyonu haline olabilir. Yan etki olarak, iki işlevi aynı adresi paylaşıyor. Bu yasadışı olduğunu sanıyordum, ama standart yasa dışı nerede olduğunu bulamıyorum.

The Gold linker Ayrıca fonksiyonları, her iki safe all bir ayar çekiliyor. safe Eğer işlev bir adres alınır, eğer adresi alınması durumunda bile all kıvrımlar süre katlanmış, değil anlamına gelir. Altın safe-eğer işlevleri farklı Adres var davranır kat.

Süre katlanabilir olabilir beklenmedik, ve orada bir kod kullanır farklı (aynı uygulama) işlevleri olan farklı adresler (yani tehlikeli olabilir kat), aslında yasadışı altında geçerli standart C? (Bu noktada C 14) Doğal olarak-eğer safe katlanır yasal ()

CEVAP
23 EKİM 2014, PERŞEMBE


defect report 1400: Function pointer equality Bu konu ile ilgilenir gibi geliyor bana bu optimizasyonu yapmak için Tamam olduğunu söylemek gibi görünüyor ama yorum belirtmek gibi bir anlaşmazlık var. O diyorvurgu benim):

5.10 [ifadeye göre.eq] paragraf 2,İki tek fonksiyon işaretçiler eğer aynı işlevi işaret eğer eşit karşılaştırın. Ancak, bir olarak optimizasyonuuygulamaları şu anda işlevleri aliasingbu aynı tanımları vardır. Standart ihtiyacı olup olmadığı belli değil açıkça bu optimizasyon ile başa çıkmak için ya da değil.

ve cevap şu oldu:

Standart gereksinimleri konusunda çok açıktır, veuygulamaları ücretsiz olan yapılar içinde optimize “-” eğer kural.

Bu iki konu hakkında soru soruyor:

  • Bu işaretçileri eşit kabul edilmesi gerekiyor
  • İşlevleri birleştirmek için tamam mı

Yoruma dayalı yanıt iki yorum görüyorum

  1. Bu optimizasyon Tamam, standart uygulama altında bu özgürlüğü verir-eğer kural.-eğer kuralkaplıdır bölüm 12* *ve sadece uygulama standardı açısından gözlemlenebilir davranışı taklit etmek anlamına gelir.Bu hala yanıt benim yorumum.

  2. Elinizde bu sorunu tamamen göz ardı edilir ve deyimi sadece standart herhangi bir düzeltme açıkça çünkü gerekli olduğunu söylüyor-eğer kurallarıkapsar ama bu yorumu okuyucuya alıştırma olarak bırakılmıştır. Bu görünümü kapatmak veremem yanıt terseness nedeniyle kabul etse, tamamen yararsız bir yanıt oluyor. Ayrıca, eğer varsa, sorunu işaret söyleyebileceğim kadarıyla NAD diğer konularda yanıtları ile tutarsız görünüyor.

Taslak standart diyor

Biliyoruz beri uğraşıyoruz-eğer kuralbiz ve bölüm 1.8 not diyor ki: oradan başlayın

Bir nesne olmadığı sürece sıfır-tarla bit veya bir temel sınıf bir sınıfın. boyutu, o nesnenin adresi ilk bayt adresi kaplar. Bit alanları olmayan iki nesne aynı olabilir eğer diğer bir sınıfın, ya da en azından biri ise adresi temel sınıf sınıfın bir boyutu sıfır ve farklı tür vardır; aksi takdirde, farklı Adres var ederler.4

ve not 4 diyor ki:

” Kural bir uygulama iki depolamak için izin verilir “gibi-Eğer altında adres ya da bir obje deposu değil aynı makine de itirazı olan varsa ... program olamaz farkı inceleyin

ama bu bölüm bir not diyor:

Bir işlev bir nesne ya da kaplar bakılmaksızın değildir nesneleri bu şekilde depolama

normatif olmasa da, bir nesne için gereksinimleri paragrafta 1 bir işlevi bağlamında mantıklı değil ve bu not ile tutarlı olduğunu, böylece koydu. Açıkça bazı istisnalar dışında nesneleri yumuşatma ama işlevleri için böyle bir sınırlama geçerlidir kısıtlanmış.

Bir sonraki bölüm 17**Eşitlik operatörleridiyor ki (vurgu benim):

[...]İki işaretçiler null, hem . eğer eşit karşılaştırın ^strong>her iki nokta için aynı işlevi, ya da her ikisi de aynı adresi temsil eder(3.9.2), aksi takdirde eşit olmayan karşılaştırır.

bize iki işaretçiler söyler eğer eşit

  • Null işaretçiler
  • Aynı işlevi gösteriyor
  • Aynı adresi temsil eder

ya da her ikisi de aynı adresi temsil ederyeterince enlem derleyici izin vermek gibi görünüyor iki farklı fonksiyonlar ve diğer fonksiyonları farklı işaretçiler eşitsiz karşılaştırmak için gerektirmez.

Gözlemler

Keith Thompson temel sorunları onlar beri cevap ekleyerek değer olduğunu hissediyorum bazı büyük gözlemler yer yaptı, diyor

Bir program eğer baskılar sonucu& = = &bar foobu gözlemlenebilir davranış; söz konusu optimizasyon gözlemlenebilir davranış değişiklikleri.

katılıyorum ve eğer varsa işaretçileri durabilmek için bir gereklilik olduğunu gösteriyor olabilir eğer bu gerçekten de aykırı olur-eğer kuralama şu ana kadar bunu gösterebiliriz.

ve:

[...]boş bir işlevi tanımlayan bir program düşünün ve kullanımları eşsiz değerler (düşünün . adres olarak ^strong>SİG_DFL,SİG_ERRveSİG_İGN &; lt sinyal.h>/&; csignal> lt;). Onlara atama aynı Adres olacaktır böyle bir programın sonu

C standardı bu makrolar oluşturmak için gerektirir benim yorumda da belirtildiği gibifarklı değerlerC11 7.14:

farklı değerler ile sabit ifade genişletmek olan [...] yazın için ikinci bağımsız değişken ile uyumlu, ve dönüş değeri yok bu, eşitsiz karşılaştırın olan sinyal işlevi, ve herhangi bir beyan edilebilir işlevin adresini[...]

Yani bu davayı kaplı olmasına rağmen belki de bu en tehlikeli kılacak diğer durumlar vardır.

Güncelleme

Hubička gcc bir geliştirici bir blog yazısı Link time and inter-procedural optimization improvements in GCC 5 kod katlama yazdı Jan kapadı birçok konuları biriydi.

Onunla aynı adrese katlanır aynı fonksiyonları davranış uygun olup olmadığı hakkında yorum yapmak istedim ve davranış uygun değil diyor ve gerçekten de böyle bir iyileştirme gcc kendisi kıracak:

Oldukça saldırgan burada MSVC yani aynı Adres var, iki işlevi açmak için uygun değil. Bu yüzden, örneğin yapıyor, sonları sürpriz adresime karşılaştırın önceden derlenmiş bir üstbilgi kodu yapılır çünkü kendisi GCC. Birçok diğer projeler, Firefox dahil olmak üzere çalışır.

Ay kusur raporları okuma ve optimizasyon sorunları düşünüp daha sonra geriye dönüp baktığımda, komitenin yanıtın daha muhafazakar bir okuma eğilimliyim. Bir işlevin adresi alarak gözlemlenebilir bir davranıştır ve bu nedenle katlanır aynı fonksiyonları bozmaz-eğer kural.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BradleyWuzHere

    BradleyWuzHe

    25 NİSAN 2011
  • TomOdellVEVO

    TomOdellVEVO

    29 Mayıs 2012
  • Willie D.

    Willie D.

    16 Aralık 2006