Ketika saya memiliki loop dan di dalam loop ini membuat variabel stack baru (tidak mengalokasikannya di heap dan variabel memegangnya dinyatakan di dalam tubuh loop), adalah destruktor objek ini dijamin akan dipanggil sebelum iterasi berikutnya dimulai, atau mungkin loop terbuka oleh kompiler mengubah sesuatu tentang itu?
c++
destructor
pengguna1282931
sumber
sumber
Jawaban:
Dari
n4800
:§6.3.3 Lingkup Blok :
§10.3.6 Destructors :
§4.1.1 Mesin abstrak :
[Tekankan milikku]
Jadi iya. Variabel Anda keluar dari ruang lingkup pada akhir loop (yang merupakan blok) dan karenanya destruktornya disebut sejauh siapa pun yang mengamati perilaku program dapat mengetahui .
sumber
call
diedit sama sekali. Atau, jika mereka secara efektif (as-jika aturan) tidak melakukan apa-apa, mungkin tidak ada perakitan untuk destruktor yang dihasilkan.Iya. Lebih mudah untuk memvisualisasikan ketika Anda mempertimbangkan "blok" di mana Anda mendeklarasikan variabel, yaitu antara sepasang kawat gigi. Loop adalah blok itu sendiri, dan ketika mencapai braket penutup, sebelum iterasi berikutnya, semua destruktor variabel penyimpanan otomatis yang dinyatakan dalam loop disebut.
Sebagai aturan umum, jangan berpikir tentang apa yang akan dioptimalkan oleh kompiler, karena masih perlu menjamin perilaku program Anda, apa pun yang dilakukan untuk mengoptimalkannya. Jika demikian, loop unrolling tidak akan mengubah apa pun ke efek itu jika itu terjadi.
sumber
[class.copy.elision]
for(...) X x{};
danx
objek akan dibangun + dihancurkan di setiap iterasi. Demo langsung . Bagian Standar yang relevan adalah stmt.iter / 2 .[stmt.iter]
itu murni ekuivalen (penekanan tambang): "Jika substatemen dalam pernyataan iterasi adalah pernyataan tunggal dan bukan pernyataan gabungan, seolah-olah itu ditulis ulang menjadi pernyataan gabungan yang mengandung pernyataan asli. " Intinya, dengan atau tanpa kawat gigi untuk satu pernyataan berarti hal yang persis sama dan kawat gigi itu implisit. Saya menghilangkannya untuk kejelasan.Destructor dipanggil untuk setiap iterasi. Jadi dalam beberapa kasus lebih cepat untuk mendeklarasikan variabel di luar loop daripada di loop. Dengan asumsi kasus berikut:
Destuktor tidak dipanggil saat menggunakan loop dieksekusi. Itu hanya menimpa
temp
.Tetapi jika Anda menggunakan
std::string temp = arr[i]
konstruktor dan destruktor dipanggil untuk setiap iterasi. Saya pikir ini menambahkan sedikit runtime jika Anda memiliki loop yang dieksekusi sangat sering.sumber
Destuktor disebut sebelum iterasi berikutnya
sumber
Tentu saja dtor disebut pada akhir iterasi dan loop terbuka seharusnya tidak mengubah perilaku ini, karena optimasi lainnya (optimasi tidak boleh memodifikasi perilaku program), kecuali beberapa jenis RVO dan sejenisnya yang dapat menghilangkan beberapa kreasi objek semantik palsu. .
sumber