/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
C/C++ og array initialisering
Fra : Preben


Dato : 24-06-10 08:09

Hej

Vi er et par stykker som ikke kan forstå hvorfor det er muligt at skrive
dette:

-----
#include <iostream>


void method(unsigned int size) {
int array[size];

for (unsigned int i = 0; i < size; ++i) {
array[i] = i;
}

for (unsigned int i = 0; i < size; ++i) {
std::cout << array[i] << std::endl;
}
}


int main() {
std::cout << "Hello world!" << std::endl;
method(5);
return 0;
}
-----

Se nærmere på metoden kaldet "method", men modtager en parameter der
hedder size og initialiserer på metodens første linie et array til denne
størrelse. Gcc (version 4.3) accepterer denne konstruktion uden videre.
Er dette tilladt? Vi mener at man burde have skrevet:

int array[] = new int[size];

men alligevel accepterer gcc det. Er der nogen der kan forklare hvorfor
man accepterer dette (antaget at man rent faktisk ikke bør kunne skrive
det på den måde).



- Preben

 
 
Mogens Hansen (24-06-2010)
Kommentar
Fra : Mogens Hansen


Dato : 24-06-10 08:47


"Preben" <64bitNOnoSPAMno@mailme.dk> wrote in message
news:4c230465$0$278$14726298@news.sunsite.dk...
> Hej
>
> Vi er et par stykker som ikke kan forstå hvorfor det er muligt at skrive
> dette:
>
> -----
> #include <iostream>
>
>
> void method(unsigned int size) {
> int array[size];
>
> for (unsigned int i = 0; i < size; ++i) {
> array[i] = i;
> }
>
> for (unsigned int i = 0; i < size; ++i) {
> std::cout << array[i] << std::endl;
> }
> }
>
>
> int main() {
> std::cout << "Hello world!" << std::endl;
> method(5);
> return 0;
> }
> -----
>
> Se nærmere på metoden kaldet "method", men modtager en parameter der
> hedder size og initialiserer på metodens første linie et array til denne
> størrelse. Gcc (version 4.3) accepterer denne konstruktion uden videre.
> Er dette tilladt?

Nej - hvis det oversætter er det en sprogudvidelse som gcc har lavet.
I C99 blev det muligt at lave arrays på den måde, men programmet er åbenlyst
et C++ program og der er det ikke muligt og det bliver det heller ikke i
C++0x (den kommende standard)

> Vi mener at man burde have skrevet:
>
> int array[] = new int[size];

Det er en mulighed, som vil være en tilladt C++ konstruktion.

Men det er klart at foretrække at skrive
std::vector<int> array(size);
Det er nemt, og så er man fri for bekymringer om frigivelse af hukommelse.
Det er iøvrigt, så vidt jeg har forstået, grunden til at man ikke har taget
C99 konstruktionen ind i C++0x.

>
> men alligevel accepterer gcc det. Er der nogen der kan forklare hvorfor
> man accepterer dette (antaget at man rent faktisk ikke bør kunne skrive
> det på den måde).

Et gæt er at det er rimeligt nemt at implementere, hvis man har lavet
implementeringen i C99.
Et andet gæt er at nogen, som er med til at lave gcc, mener at det være en
del af C++.

--
Venlig hilsen

Mogens Hansen



Preben (24-06-2010)
Kommentar
Fra : Preben


Dato : 24-06-10 13:05

> Nej - hvis det oversætter er det en sprogudvidelse som gcc har lavet.
> I C99 blev det muligt at lave arrays på den måde, men programmet er åbenlyst
> et C++ program og der er det ikke muligt og det bliver det heller ikke i
> C++0x (den kommende standard)
>
>> Vi mener at man burde have skrevet:
>>
>> int array[] = new int[size];
>
> Det er en mulighed, som vil være en tilladt C++ konstruktion.
>
> Men det er klart at foretrække at skrive
> std::vector<int> array(size);
> Det er nemt, og så er man fri for bekymringer om frigivelse af hukommelse.
> Det er iøvrigt, så vidt jeg har forstået, grunden til at man ikke har taget
> C99 konstruktionen ind i C++0x.

Hvad med std::vector og performance? Er det ikke væsentligt dyrere at
anvende en vector frem for et array? Jeg tænker, hvis man opretter og
nedlægger mange vector's er der vel et performance overhead fremfor
almindelige arrays (vha. new).


>> men alligevel accepterer gcc det. Er der nogen der kan forklare hvorfor
>> man accepterer dette (antaget at man rent faktisk ikke bør kunne skrive
>> det på den måde).
>
> Et gæt er at det er rimeligt nemt at implementere, hvis man har lavet
> implementeringen i C99.
> Et andet gæt er at nogen, som er med til at lave gcc, mener at det være en
> del af C++.

Ok. gcc blev ellers noget mere stringent efter 3.4, men åbenbart ikke
nok. Troede rent faktisk heller ikke man måtte i standard c. Men man
bliver jo klogere hver dag!

Og tak for svar Mogens.


- Preben

Mogens Hansen (24-06-2010)
Kommentar
Fra : Mogens Hansen


Dato : 24-06-10 13:44


"Preben" <64bitNOnoSPAMno@mailme.dk> wrote in message
news:4c2349b7$0$272$14726298@news.sunsite.dk...

[8<8<8<]
> Hvad med std::vector og performance?

En vector laver (almindeligvis) dynamisk allokering - lige som det koe du
skrev, og der er praktisk taget ikke noget performance overhead.
Derimod har C99's måde (almindeligvis) at lave dynamisk størrelse array på
en performance fordel, fordi pladsen ikke allokeres på heapen.

> Er det ikke væsentligt dyrere at
> anvende en vector frem for et array? Jeg tænker, hvis man opretter og
> nedlægger mange vector's er der vel et performance overhead fremfor
> almindelige arrays (vha. new).

Der er praktisk taget ingen performance forskel på at skrive
vector<int> vi(7);
og
int* ai = new int[7];
....
delete [] ai;
for det er det samme der sker, med undtagelse af vectoren har styr på hvor
mange elementer der faktisk er i vectoren og hvor mange der er plads til.
Dertil kommer at vector'en laver default initialisering af elementerne, som
også koster noget.
Hvis man vil undgå det, kan man skrive
vector<int> vi;
vi.reserve(7);

Jeg har aldrig oplevet at vector gav performance problemer som kunne løses
ved at skrive new T[] i stedet.
Man kan komme ud for nogle problemer med ekstra kopiering af data, når en
vector returneres fra en funktion - men det bliver løst i C++0x, når
compilere og standard biblioteker understøtter move-constructor.

[8<8<8<]
> Ok. gcc blev ellers noget mere stringent efter 3.4, men åbenbart ikke
> nok.

Det er en sprogudvidelse - næsten alle compilere har nogle sprogudvidelser.
Man skal være forsigtig med at bruge dem, for man bliver bundet til den
compiler.

> Troede rent faktisk heller ikke man måtte i standard c.

Det blev en del af C99 (altså i 1999), men mit indtryk er at C99 ikke bliver
brugt særligt meget og ikke så meget som man havde håbet.

--
Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177414
Tips : 31962
Nyheder : 719565
Indlæg : 6407837
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste