Derleyicinin hangi işlevleri ürettiğini nasıl öğrenebilirim?


11

Derleyici tarafından üretilen fonksiyonları, üçün kuralını ve beşin kuralını biliyorum. Gerçek dünya senaryolarında, derleyici tarafından oluşturulan işlevlerin (kurucular, atama operatörleri, yıkıcı) tam olarak hangisinin derleyici tarafından oluşturulduğunu anlamak önemsiz olmayabilir.

Belirli bir sınıf için derleyici tarafından üretilen işlevleri listelemenin bir yolu var mı?

Öncelikle Visual Studio 2019 ve Xcode ile ilgileniyorum, ancak genel bir çözüm daha da hoş olurdu.

Yanıtlar:


11

Kurallar karmaşık. Ben çalacak başka bir yanıt dan itibaren bir tablo tırnak Howard Hinnant sunumu .

resim açıklamasını buraya girin

Buradaki ahlaki, iyi bir uygulamanın derleyicinin örtülü beyanlarına güvenmemesi ve her özel üyeyi (gereksinimlerinize bağlı olarak varsayılan veya silinmiş olarak) açıkça beyan etmemesidir .


Her özel üyeyi açıkça bildirirseniz, hareket oluşturucu ve atama işleci için "bildirilmedi" özel üye durumunu kaybedersiniz.
Maxim Egorushkin

@MaximEgorushkin benim açımdan onlara ihtiyacınız varsa varsayılan olarak bildirmektir (varsayılan olarak hala beyan edilmemiş olsa da) veya istemiyorsanız silinir.
bolov

2
@bolov Grafik yararlıdır ancak bu sorumu yanıtlamıyor. Hangi işlevlerin derleyici tarafından oluşturulduğunu öğrenmek istiyorum. Başka bir deyişle: Teoride ne olması gerektiğini değil, pratikte neler olduğunu soruyorum.
Helge Klein

1
@ tjwrona1992: Bu argümanla, kodumuzu asla test etmemiz gerekmeyecekti, çünkü derleyici istediğimizden farklı bir şey yaptıysa, içinde bir hata olması gerektiğini bilirdik.
ruakh

1
@ tjwrona1992: Evet, kesinlikle. Benzer şekilde, derleyicinizin ne ürettiğini görmek, derleyicinin doğru olduğunu doğrulamak değil, derleyiciye doğru girdiyi sağladığınızı doğrulamaktır.
ruakh

7

"Belirli bir sınıf için derleyici tarafından oluşturulan işlevleri listelemenin bir yolu var mı?"

Elbette var. On Linux (ve diğer Unix sistemleri) kullanabilirsiniz nm, readelfve objdumpoluşturulan nesne dosyaları / libraries / herhangi ihraç semboller (ve çok daha fazlası) onları sökmeye ve incelemek için çalıştırılabilir.

Windows'da benzer araçlar var , biliyorum, ama bu çok fazla çalıştığım bir platform değil, bu yüzden maalesef orada tam araç isimlerini adlandıramıyorum.


1
Bu araçlar çok iyi hangi işlevleri göstermek olmasa bile olabilir üretilmiş olan (yani derleyici bunları üretmek için izin verildi, ancak rahatsız karar böylece bu işlevleri hiç kullanılmamış ya da bağlantı zaman kodu eleme onlardan kurtuldum)
JMAA

@JMAA Çoğu durumda, "üretilmesine izin verildi ancak hiç kullanılmadı", standart terimlerle, bir işlevin "örtük olarak bildirildi", ancak "örtük olarak tanımlanmadı" anlamına gelir. Evet, bu hala satır içi devre dışı olsa bile sembolleri görmeyeceğiniz anlamına gelir.
aschepler

1
Kesin olarak, bu cevap şu soruya daha kesin bir şekilde yanıt verir: "Derleyici hangi yöntemleri üretti?" Bu çok daha az kesin olan "Derleyici tarafından farklı bir bağlamda hangi yöntemler oluşturulmuş olabilir?" Sorusuyla aynı şey değildir.
rici

@rici Doğru. Ama daha kesin olan soru kolayca cevaplanamaz, bu yüzden cevaplanabilecek olana gittim. Cevabımın değerli olmadığını düşünüyorsanız, oylarınızı düşürmekten çekinmeyin.
Jesper Juhl

1
@jesper: hayır, zaten oyumu iptal ettim. Dediğim gibi cevapladığınız sorunun daha kesin olduğunu düşünüyorum. Niyet olabilen diğer soru, el yapımı bir şey gerektiriyor, çünkü konfraktiftir: hangi varsayımsal bağlamları içerebileceğini bilmiyoruz. Ama bu kasıtlı olarak ya da değil, tam olarak sorulan soru, cevaplamak için kudos.
rici

1

Bu şu anda sadece kısmi bir cevaptır.

Visual Studio 2019

Kurucular

Bir sınıf nesnesi tanımlarken, Visual Studio'nun IntelliSense işlevi, hem derleyici tarafından oluşturulan hem de kendi oluşturucularınızı gösterir:

resim açıklamasını buraya girin

Ne yazık ki bu bilgi her zaman ortaya çıkmıyor. Yukarıdaki ekran görüntüsünde çalışmasını sağlamak için, parantez içine bir şey yazmak zorunda kaldım, dolayısıyla virgül.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.