Statinis masyvas ir dinaminis masyvas C + +

Koks skirtumas tarp statinio masyvo ir dinaminio masyvo C + +?

Turiu susitarti dėl savo klasės, ir jis sako, kad nenaudoja statinių masyvų, bet tik dinaminių masyvų. Pažvelgiau į knygą ir internetą, bet neatrodo, kad suprantu.

Maniau, kad statinis buvo sukurtas kompiliavimo metu ir dinamiškai runtime, bet aš galėčiau su tuo susieti su atminties paskirstymu.

Ar galite paaiškinti skirtumą tarp statinio masyvo ir dinaminio masyvo C + +?

60
20 апр. nustatė user69514 balandžio 20 2010-04-20 05:03 '10, 5:03, 2010-04-20 05:03
@ 10 atsakymų

Vietoje matricos yra sukurtos ant kamino ir turi automatinį saugojimo laiką - nereikia rankiniu būdu valdyti atminties, bet jos sunaikinamos, kai baigsis funkcija. Jie turi turėti fiksuotą dydį:

 int foo[10]; 

Įrenginiai, sukurti naudojant operator new[] turi dinamišką saugojimo trukmę ir yra saugomi krūvoje (techniškai „nemokama parduotuvė“). Jie gali būti bet kokio dydžio, tačiau juos turite skirti ir atleisti, nes jie nėra kamino rėmo dalis:

 int* foo = new int[10]; delete[] foo; 
64
20 апр. Michael Mrozek atsakymas, pateiktas balandžio 20 d 2010-04-20 05:08 '10, 5:08, 2010-04-20 05:08

statinis yra raktinis žodis C ir C ++, todėl vietoj bendrinio aprašomojo termino statinis turi labai specifinę reikšmę, kai jis taikomas kintamajam ar masyvui. Padidinti painiavą, ji turi tris skirtingas reikšmes atskiruose kontekstuose. Dėl šios priežasties statinis masyvas gali būti ir fiksuotas, ir dinamiškas.

Leiskite paaiškinti:

Pirmasis yra C ++:

  • Statinis klasės narys yra vertė, kuri nėra sukurta konstruktoriaus arba nėra pašalinta destruktoriaus. Tai reiškia, kad elementas turi būti inicijuotas ir palaikomas kitu būdu. Statinis narys gali būti rodyklė, inicijuota į nulį ir paskui priskirtas, kai konstruktorius pirmą kartą vadinamas. (Taip, tai būtų statinis ir dinamiškas).

Du yra paveldėti iš C:

  • funkcijos viduje statinis kintamasis yra tas, kurio atminties elementas yra saugomas tarp funkcijų skambučių. Tai yra statiška ta prasme, kad ji inicijuojama tik vieną kartą ir išlaiko savo vertę tarp funkcijų skambučių (naudojant statistiką funkcija tampa ne atgaila, tai yra, neįmanoma)

  • statiniai kintamieji, deklaruoti už funkcijų ribų, yra pasauliniai kintamieji, kuriuos galima pasiekti tik iš vieno modulio (šaltinio kodas su bet kuriuo kitu #)

Klausimas (manau), kad norėjote paklausti, yra skirtumas tarp dinaminių masyvų ir fiksuotų ar kompiliavimo masyvų. Tai paprastesnis klausimas: kompiliavimo laiko matricos yra apibrėžtos iš anksto (kai programa yra sukompiliuota) ir yra funkcijų kamino rėmo dalis. Jie išsiskiria prieš pradedant pagrindinę funkciją. dinaminės matricos priskiriamos veikimo metu, naudojant „naują“ raktinį žodį (arba „malloc“ šeimą iš C) ir jų dydis nežinomas iš anksto. dinaminiai paskyrimai nebus automatiškai išvalomi, kol programa nustos veikti.

20
23 июля '13 в 18:30 2013-07-23 18:30 atsakymą pateikė Joshua Clayton, liepos 23 d., 13 val., 13.30 val

Manau, kad jūsų klasėje naudojama semantika yra paini. Tai, ką tikriausiai reiškia „statinis“, yra tiesiog „pastovus dydis“, o tai, ką tikriausiai reiškia „dinamiškas“, yra „kintamas dydis“. Tokiu atveju masyvas, kurio dydis yra pastovus, gali atrodyti taip:

 int x[10]; 

ir „dinamiškas“ - tai bet kokia struktūra, leidžianti padidinti arba sumažinti bazinę saugyklą veikimo metu. Daugeliu atvejų pakanka klasės std::vector iš standartinės C ++ bibliotekos. Naudokite jį taip:

 std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized. 

std::vector turi operator[] , todėl jūs galite jį naudoti su ta pačia semantika kaip ir masyvas.

10
20 апр. Ben Collins atsakymas, balandžio 20 d 2010-04-20 05:11 '10, 5:11, 2010-04-20 05:11

Statiniai matricos skiria atmintį kompiliavimo metu, o atmintis priskiriama kaminai. Nors dinaminės matricos skiria atmintį vykdymo metu, o atmintis skiriama iš krūvos.

 int arr[] = { 1, 3, 4 }; // static integer array. int* arr = new int[3]; // dynamic integer array. 
6
20 апр. Atsakymą pateikė Jagannath balandžio 20 d 2010-04-20 05:08 '10, 5:08, 2010-04-20 05:08

Svarbu turėti aiškius žodžių apibrėžimus. Deja, yra daug apibrėžimų, ką reiškia statinis ir dinaminis masyvas.

Statiniai kintamieji yra kintamieji, apibrėžti naudojant statinį atminties paskirstymą, tai yra bendra sąvoka, nepriklausoma nuo C / C ++. C / C ++ sistemoje galime sukurti statinius kintamuosius, turinčius pasaulinę, failo ar vietinę taikymo sritį:

 int x[10]; //static array with global scope static int y[10]; //static array with file scope foo() { static int z[10]; //static array with local scope 

Automatiniai kintamieji paprastai įgyvendinami naudojant atminties paskirstymą pagal steką . Automatinis masyvas C / C ++ gali būti sukurtas taip:

 foo() { int w[10]; //automatic array 

Tai, kas jungia šias matricas, x, y, z ir w , yra tai, kad kiekvieno iš jų dydis yra fiksuotas ir nustatomas kompiliavimo metu.

Viena iš priežasčių, kodėl svarbu suprasti skirtumą tarp automatinio masyvo ir statinio masyvo, yra tai, kad statinis saugojimas paprastai įgyvendinamas objekto failo duomenų sekcijoje (arba BSS sekcijoje ), ir kompiliatorius gali naudoti absoliučius adresus, kad galėtų pasiekti masyvus, kurie neįmanomi saugykloje.

Tai, ką paprastai reiškia dinaminė masyvas , nėra keičiamo dydžio, tačiau yra įgyvendinama naudojant dinaminį atminties priskyrimą su fiksuotu dydžiu, nustatytu vykdymo metu. „C ++“ tai daroma naudojant new operatorių.

 foo() { int *d = new int[n]; //dynamically allocated array with size n 

Tačiau galima sukurti automatinį masyvą su nustatymų, apibrėžtų vykdymo metu, dydžiu naudojant

 foo() { int *s = (int*)alloca(n*sizeof(int)) 

Tikros dinaminės matricos atveju naudokite kažką panašaus į std::vector C ++ (arba kintamo ilgio matricą C ).

Ką reiškia paskyrimas OP? Manau, kad aišku, jog norimas ne statinis ar automatinis masyvas, bet buvo naudojamas dinamiškos atminties priskyrimui naudojant new operatorių arba nefiksuoto dydžio masyvą, pavyzdžiui, std::vector .

3
20 окт. atsakymas pateikiamas Z boson 20 oct. 2014-10-20 16:15 '14, 16:15 2014-10-20 16:15

Manau, kad šiame kontekste tai reiškia, kad jis yra statinis ta prasme, kad dydis yra fiksuotas. Naudokite std :: vector. Jis turi funkciją resize ().

3
20 апр. atsakymą pateikė Eddy Pronk 20 balandis. 2010-04-20 05:06 '10, 5:06, 2010-04-20 05:06

Taip, kompiliavimo metu sukuriama galiojanti statinė masyvas, kai vykdymo metu sukuriama dinamiška masyvas. Kur, kadangi skirtumas vis dar yra susijęs su jų atminties ląstelėmis, statiniai yra ant kamino, o dinamika sukuriama ant krūvos. Viskas, kas patenka į krūvą, reikalauja atminties valdymo, kol pasirodys šiukšlių surinkėjas, pvz., „.Net“ sistemos atveju, priešingu atveju kyla pavojus, kad atsiras atmintis.

0
27 февр. atsakymą pateikė Aadil Imran 27 vasario mėn. 2013-02-27 10:43 '13, 10:43 am 2013-02-27 10:43

Statinis masyvas: efektyvumas. Dinaminis paskirstymas ar išleidimas nereikalingas.

C, C ++ funkcijose, įskaitant statinį modifikatorių, deklaruoti blokai yra statiniai. Pavyzdys: static int foo [5];

0
17 дек. Khuê Phạm atsakymas yra 17 gruodis. 2013-12-17 16:44 '13, 16:44, 2013-12-17 16:44

Jūs galite turėti pseudo-dinaminę masyvą, kurio dydį vartotojas nurodo vykdymo metu, bet po to nustato.

 int size; cin >> size; int dynamicArray[size]; 
0
17 окт. Joshua Oliphant atsakymas spalio 17 d 2014-10-17 06:55 '14 at 6:55 2014-10-17 06:55

statinis keltuvas su priskyrimu elementams masyvo pusėje

dinamiškas organizatorius be elementų masyvo pusėje

Pavyzdys:

  char a[10]; //static array char a[]; //dynamic array 
-3
27 февр. Atsakymą pateikė karthik , vasario 27 d. 2013-02-27 09:46 '13, 9:46, 2013-02-27 09:46