begrip destructor in c ++

Zoals we allemaal weten, zullen wanneer een functie terugkeert, stack-toegewezen objecten worden teruggevorderd en de bijbehorende destructors daarvoor worden aangeroepen. Mijn vraag is: hoe wordt een geheugenlocatie bepaald om objecten te representeren zodat we de destructor kunnen noemen? En is er run-time overhead opgelopen om dit te doen?

0
@DavidSchwartz Dat is precies wat ik vraag.
toegevoegd de auteur dacongy, de bron
Vraag je je hoe de implementatie weet welke stack objecten moeten worden vernietigd en waar ze zich bevinden?
toegevoegd de auteur David Schwartz, de bron
De geheugenlocatie is een implementatiedetail; waarom ben je bezorgd? En welke runtime gebruik je? Werkt u op een virtuele machine of een native instructieset?
toegevoegd de auteur mda, de bron

3 antwoord

De locatie van aan de stapel toegewezen objecten wordt berekend als een offset ten opzichte van de huidige stapelaanwijzerpositie, dus eigenlijk is er geen berekening nodig.

In tegenstelling tot aan de heap toegewezen objecten waarin de dynamische geheugenbeheerder moet beslissen waar het object wordt toegewezen, is de stapel gewoon lineair en groeit deze overeenkomstig aan de behoefte, bij compilatie weet de compiler dat een object zich bijvoorbeeld op de huidige aanwijzer bevindt minder een opgegeven aantal bytes en zal die waarde overal in de binaire code gebruiken wanneer die variabele nodig is.

2
toegevoegd

Ik weet niet precies wat u precies vraagt, maar de geheugenlocatie van stack-toegewezen objecten is bekend tijdens het compileren. Er is geen runtime-overhead om hun locatie te bepalen.

2
toegevoegd
Klopt het: verwijzingen naar deze objecten zijn bekend tijdens het compileren en oproepen naar destructors worden ingevoegd door de compiler in de postlogue van de functie.
toegevoegd de auteur dacongy, de bron
Nou, niet echt ... Heel erg bedankt voor het antwoord!
toegevoegd de auteur dacongy, de bron
ja, hoewel ik nu vermoed dat je aan huiswerk werkt ...
toegevoegd de auteur Ned Batchelder, de bron

hoe wordt een geheugenlocatie bepaald om objecten te representeren zodat we de destructor kunnen noemen?

Geheugenlocatie bepaalt niet wanneer de constructor wordt gebeld. De compiler weet welke variabelen op de stapel worden toegewezen en creëert de juiste code om de overeenkomstige destructors te callen.

Tenminste staan ​​ze normaal op de stapel. Het punt is dezelfde logica die kan worden gebruikt ongeacht waar het geheugen is opgeslagen. Wordt opgeslagen op de stapel betekent gewoon dat ze op de een of andere manier moeten worden gebeld.

1
toegevoegd