Bagaimana cara mengetahui fungsi yang dihasilkan oleh kompiler?

11

Saya tahu tentang fungsi yang dihasilkan kompiler, aturan tiga dan aturan lima. Dalam skenario dunia nyata, mungkin tidak sepele untuk mencari tahu persis mana fungsi yang dihasilkan kompiler (konstruktor, operator penugasan, destruktor) yang sebenarnya dibuat oleh kompiler.

Apakah ada cara untuk membuat daftar fungsi yang dihasilkan kompiler untuk kelas tertentu?

Saya terutama tertarik pada Visual Studio 2019 dan Xcode, tetapi solusi generik akan lebih diterima.

Helge Klein
sumber

Jawaban:

11

Aturannya rumit. Saya akan mencuri dari jawaban lain yang mengutip tabel dari presentasi Howard Hinnant .

masukkan deskripsi gambar di sini

Moral di sini adalah bahwa praktik yang baik adalah tidak bergantung pada kompiler menyatakan implisit dan secara eksplisit mendeklarasikan setiap anggota khusus (sebagai standar atau dihapus, tergantung pada kebutuhan Anda)

bolov
sumber
Jika Anda secara eksplisit mendeklarasikan setiap anggota khusus Anda kehilangan status anggota khusus "tidak dinyatakan" untuk operator konstruktor dan penugasan bergerak.
Maxim Egorushkin
@ MaximEgorushkin maksud saya adalah mendeklarasikan default-nya jika Anda membutuhkannya (walaupun default masih bisa berarti tidak dinyatakan) atau dihapus jika Anda tidak menginginkannya.
bolov
2
@bolov Bagan ini berguna tetapi ini tidak menjawab pertanyaan saya. Saya ingin mencari tahu fungsi mana yang sebenarnya dihasilkan oleh kompiler. Dengan kata lain: Saya tidak bertanya tentang apa yang seharusnya terjadi dalam teori, tetapi apa yang terjadi dalam praktik.
Helge Klein
1
@ tjwrona1992: Dengan argumen itu, kita tidak akan pernah perlu menguji kode kita, karena kita akan tahu bahwa jika kompiler melakukan sesuatu yang berbeda dari yang kita maksudkan maka harus ada bug di dalamnya.
ruakh
1
@ tjwrona1992: Ya, persis. Demikian juga, titik melihat apa yang telah dihasilkan oleh kompiler Anda bukan untuk memverifikasi bahwa kompiler itu benar, tetapi, untuk memverifikasi bahwa Anda memberikan kompiler dengan input yang benar.
ruakh
7

"Apakah ada cara untuk membuat daftar fungsi yang dihasilkan kompiler untuk kelas tertentu?"

Tentu saja ada. Di Linux (dan sistem Unix lainnya) Anda dapat menggunakan nm, readelfdan objdumppada file objek yang dihasilkan / perpustakaan / executable untuk membongkar mereka dan memeriksa simbol yang diekspor (dan banyak lagi).

Ada alat serupa di Windows , saya tahu, tapi itu bukan platform tempat saya bekerja, jadi sayangnya saya tidak bisa menyebutkan nama alat yang tepat di sana.

Jesper Juhl
sumber
1
Meskipun alat-alat ini mungkin sangat tidak menunjukkan kepada Anda fungsi apa yang mungkin telah dihasilkan (yaitu, kompiler diizinkan untuk menghasilkannya, tetapi Anda tidak pernah menggunakan fungsi-fungsi itu sehingga memutuskan untuk tidak mengganggu, atau penghapusan kode tautan waktu menghilangkannya)
JMAA
@ JMAA Dalam kebanyakan kasus, "diizinkan untuk menghasilkan tetapi tidak pernah digunakan" akan dalam istilah standar berarti bahwa suatu fungsi "dinyatakan secara implisit" tetapi tidak "didefinisikan secara implisit". Ya, ini tetap berarti Anda tidak akan melihat simbol, meskipun inlining dinonaktifkan.
aschepler
1
Sebenarnya, jawaban ini lebih tepatnya menjawab pertanyaan yang diajukan: "Metode apa yang dihasilkan kompiler?" Itu tidak sama dengan pertanyaan yang kurang tepat "Metode apa yang mungkin dihasilkan oleh kompiler dalam konteks yang berbeda?"
rici
@rici Benar. Tetapi pertanyaan yang lebih tepat tidak mudah dijawab, jadi saya mencari apa yang bisa dijawab. Jangan ragu untuk downvote jika Anda berpikir jawaban saya tidak berharga.
Jesper Juhl
1
@ jesper: tidak, saya sudah terbalik. Saya pikir pertanyaan yang Anda jawab lebih tepat, seperti yang saya katakan. Pertanyaan lain, yang mungkin maksudnya, memerlukan beberapa handwaving karena bersifat kontrafaktual: kita tidak tahu konteks hipotetis apa yang mungkin dimasukkan. Tetapi ini adalah pertanyaan yang secara literal diajukan, sengaja atau tidak, jadi pujian untuk menjawabnya.
rici
1

Saat ini hanya sebagian jawaban.

Visual Studio 2019

Konstruktor

Ketika mendefinisikan objek kelas, fungsi IntelliSense Visual Studio menunjukkan konstruktor yang tersedia, baik yang dihasilkan kompiler dan Anda sendiri:

masukkan deskripsi gambar di sini

Sayangnya, informasi ini tidak selalu muncul. Untuk membuatnya berfungsi untuk tangkapan layar di atas, saya harus mengetikkan sesuatu di dalam tanda kurung, karenanya koma.

Helge Klein
sumber