Kodėl vykdymo aplinka negali taikyti ištrinti ar ištrinti [] vietoj programuotojo?

Aš perskaičiau, kad reikia delete[] operatorių, nes vykdymo trukmė nesaugo informacijos apie tai, ar pasirinktas blokas yra objektų, kuriems reikia destruktorių skambučių, masyvas, bet iš tikrųjų saugo informaciją apie tai, kur atmintyje yra skirtas blokas, ir žinoma, bloko dydis.
Norint prisiminti, ar naikintojai turėtų būti pakviesti ištrinti ar ne, reikės dar vieno bitų metaduomenų, tad kodėl gi ne tik tai padaryti?

Esu įsitikinęs, kad yra geras paaiškinimas, nesakau apie tai, tik noriu žinoti.

18
06 дек. nustatė Petruza 06 d. 2011-12-06 21:46 '11, 21:46, 2011-12-06 21:46
@ 4 atsakymai

Čia reikia paaiškinti du dalykus.

Pirma: prielaida, kad malloc išlaiko tiksliai nurodytą dydį.

Ne iš tikrųjų. malloc tik rūpinasi, kad būtų pakankamai didelis blokas. Nors dėl efektyvumo jis greičiausiai nebus pakabintas, jis greičiausiai suteiks jums „standartinį“ dydžio bloką, pavyzdžiui, 2^n baitų bloką. Todėl faktinis dydis (taip pat iš tikrųjų atrinktų objektų skaičius) iš tikrųjų nežinomas.

Antra: reikalingas papildomas bitas

Iš tiesų, informacija, reikalinga tam tikram objektui žinoti, ar ji yra masyvo dalis, ar ne, bus tiesiog papildomas bitas. Logiškai.

Kalbant apie įgyvendinimą, tuomet: kur jūs iš tikrųjų įdėjote šį bitą?

Tikėtina, kad objektui priskirta atmintis neturėtų būti paveikta, objektas jį naudoja pabaigoje. Taigi tada

  • tam tikroje platformoje tai gali būti išsaugota pačiame rodyklėje (kai kurios platformos ignoruoja dalį bitų), tačiau tai nėra toleruojama
  • todėl reikės papildomo saugojimo, bent baito, išskyrus atvejus, kai atsiranda derinimo problemų, tai gali būti iki 8 baitų.

Demonstravimas: (ne įtikinamai, kaip pažymėjo STH, žr. Žemiau)

 // A plain array of doubles: +-------+-------+------- | 0 | 1 | 2 +-------+-------+------- // A tentative to stash our extra bit +-------++-------++-------++ | 0 || 1 || 2 || +-------++-------++-------++ // A correction since we introduced alignment issues // Note: double aligment is most probably its own size +-------+-------+-------+-------+-------+------- | 0 | bit | 1 | bit | 2 | bit +-------+-------+-------+-------+-------+------- 

Humpf!

PAKEITIMAS

Todėl daugumoje platformų (kur sprendžiami adresai) jums reikia „išplėsti“ kiekvieną rodiklį ir iš tikrųjų padvigubinti jų dydžius (derinimo problemas).

Ar leidžiama, kad visi rodikliai būtų du kartus didesni, tik kad galėtumėte užpildyti šį papildomą bitą? Daugumai žmonių manau, kad tai būtų. Tačiau „C ++“ nėra skirta daugeliui žmonių, tai visų pirma skirta žmonėms, kurie rūpinasi našumu, greičiu ar atmintimi, ir tai yra nepriimtina.

END EDITION

Taigi, koks yra teisingas atsakymas? Teisingas atsakymas yra tai, kad tipo sistemos prarastos informacijos atgavimas yra brangus. Atsiprašome.

3
06 дек. Matthieu M. atsakymas 06 gruodis. 2011-12-06 22:08 '11, 10:08 val. 2011-12-06 22:08

Manau, kad priežastis yra ta, kad „C ++“ nepriverčia jus į kažką, ko nenorite. Ji pridėtų papildomų metaduomenų, o jei kas nors jo nenaudotų, papildomos pridėtinės sumos jiems būtų taikomos, skirtingai nei C ++ kalbos projektavimo tikslai.

border=0

Kai jums reikia šios funkcijos, C + + tikrai suteikia būdą. Tai vadinama std::vector , ir jūs beveik visada pageidaujate, kitokio tipo konteineris arba sumanus žymeklis, kad būtų išvengta new ir delete .

10
06 дек. Atsakymas, kurį pateikė Mark B 06 Dec 2011-12-06 21:49 '11 prie 21:49 2011-12-06 21:49

Jis iš esmės ateina į kalbų dizainą, nenorėdamas taikyti per daug apribojimų kūrėjams. Daugelyje C + + scenarijų, skirtų ::operator delete () , malloc() ::operator new () ir free() (daugiau ar mažiau). Standartas malloc / free nepateikia apskaitos, reikalingos daugeliui elementų įrašyti, ir neleidžia laisvai nustatyti malloc d dydžio. Įrašius kitą atminties manipuliavimo lygį tarp new Foo ir „ malloc “ kiekvienam atskiram objektui - C / C ++ požiūriu - yra gana didelis šuolis sudėtingumui / abstrakcijai. Be to, pridedant šias pridėtines išlaidas kiekvienam objektui, bus apriboti kai kurie sukurti atminties valdymo metodai, žinant, koks yra objektų dydis.

4
06 дек. atsakymą pateikė smparkes 06 dec. 2011-12-06 21:56 '11, 21:56, 2011-12-06 21:56

C ++ leidžia jums būti kuo veiksmingesnis, taigi, jei jiems reikia sekti elementų skaičių bloke, kuris bus tik papildomi 4 baitai, naudojami kiekvienam blokui.

Tai gali būti naudinga daugeliui žmonių, tačiau taip pat užkerta kelią bendram veiksmingumui tiems, kurie neprieštarauja [].

Tai panaši į skirtumą tarp „C ++“ ir „Java“. „Java“ gali būti daug greitesnė, nes niekada nereikia nerimauti dėl šiukšlių surinkimo, bet C ++, jei programuojama teisingai, gali būti efektyvesnė ir naudoti mažiau atminties, nes nereikia saugoti jokių šių kintamųjų, ir Galite nuspręsti, kada pašalinti atminties blokus.

4
06 дек. Austin Heerwagen atsakymas gruodžio 06 d 2011-12-06 21:54 '11, 21:54, 2011-12-06 21:54