/ 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
Accelerated C++, rekursiv kald
Fra : Torben W. Hansen


Dato : 17-03-06 13:39

Hejsan,

I "Accelerated C++" på side 146 vises et template eksempel som nedenfor. Mit
spørgsmål går egentlig ikke på templates, men istedet på det rekursive kald
til funktionen find(...) .

Normalt vil parametrene begin, In og x vel være lokale automatiske
variable(vist nok push/pop på stack'en), der destrueres når find(...)
slutter.

Hvis den rekursive dybde opnår at blive f.eks. fem - før udsagnet i
sætningen "if (begin == end || *begin == x)" bliver sandt - oprettet der så
fem sæt af variablene begin, In og x ?

....
template <class In, class X> In find(In begin, In end, const X& x)
{
if (begin == end || *begin == x)
return begin;
begin++;
return find(begin, end, x);
}
....

På forhåndt tak

Med venlig hilsen
Torben W. Hansen



 
 
Niels Dybdahl (17-03-2006)
Kommentar
Fra : Niels Dybdahl


Dato : 17-03-06 15:43


"Torben W. Hansen" <nospam@ins.com> wrote in message
news:441aade6$0$38735$edfadb0f@dread12.news.tele.dk...
> Hejsan,
>
> I "Accelerated C++" på side 146 vises et template eksempel som nedenfor.
> Mit spørgsmål går egentlig ikke på templates, men istedet på det rekursive
> kald til funktionen find(...) .
>
> Normalt vil parametrene begin, In og x vel være lokale automatiske
> variable(vist nok push/pop på stack'en), der destrueres når find(...)
> slutter.
>
> Hvis den rekursive dybde opnår at blive f.eks. fem - før udsagnet i
> sætningen "if (begin == end || *begin == x)" bliver sandt - oprettet der
> så fem sæt af variablene begin, In og x ?

Ja der oprettes 5 sæt af begin og In og der oprettes 5 referencer under
navnet x, men det som x refererer til bliver ikke dupleret.

Niels Dybdahl



Torben W. Hansen (17-03-2006)
Kommentar
Fra : Torben W. Hansen


Dato : 17-03-06 16:24


> Ja der oprettes 5 sæt af begin og In og der oprettes 5 referencer under
> navnet x, men det som x refererer til bliver ikke dupleret.

OK og tak for svaret !!!

Så må man passe på, at det ikke løber løbsk, ellers bliver hukommelsen
hurtig "spist" op

Med venlig hilsen
Torben W. Hansen



Bertel Brander (17-03-2006)
Kommentar
Fra : Bertel Brander


Dato : 17-03-06 21:07

Niels Dybdahl wrote:

>> Hvis den rekursive dybde opnår at blive f.eks. fem - før udsagnet i
>> sætningen "if (begin == end || *begin == x)" bliver sandt - oprettet der
>> så fem sæt af variablene begin, In og x ?
>
> Ja der oprettes 5 sæt af begin og In og der oprettes 5 referencer under
> navnet x, men det som x refererer til bliver ikke dupleret.

Jeg tror at "måske" var tættere på at være det rigtige resultat.

Compileren kan være klog nok til at vide at find ikke bruger
variablerne begin, end, og x når først den har kaldt find igen,
så der er ingen grund til at oprette et kopi af dem, men den
kan genbruge de samme.

Det er muligt at compileren også lader den returnere direkte fra
den sidste udgave af find, til den der kaldte den oprindelige find.

Det er også muligt at compileren lader det afhænge af om optimering
er enabled eller ikke.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Niels Dybdahl (20-03-2006)
Kommentar
Fra : Niels Dybdahl


Dato : 20-03-06 09:59


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:441b16b7$0$47001$edfadb0f@dread15.news.tele.dk...
> Niels Dybdahl wrote:
>
>>> Hvis den rekursive dybde opnår at blive f.eks. fem - før udsagnet i
>>> sætningen "if (begin == end || *begin == x)" bliver sandt - oprettet
>>> der så fem sæt af variablene begin, In og x ?
>>
>> Ja der oprettes 5 sæt af begin og In og der oprettes 5 referencer under
>> navnet x, men det som x refererer til bliver ikke dupleret.
>
> Jeg tror at "måske" var tættere på at være det rigtige resultat.
>
> Compileren kan være klog nok til at vide at find ikke bruger
> variablerne begin, end, og x når først den har kaldt find igen,
> så der er ingen grund til at oprette et kopi af dem, men den
> kan genbruge de samme.
>
> Det er muligt at compileren også lader den returnere direkte fra
> den sidste udgave af find, til den der kaldte den oprindelige find.

Men det kan man ikke stole på at den gør, så hvis man skal estimere
hukommelsesforbruget, så må man gå ud fra det nævnte.
Og hvis det drejer sig om hvor mange gange constructorer og destructorer
bliver kaldt, så tror jeg ikke at compileren må optimere dem væk.

Niels Dybdahl



Mogens Hansen (20-03-2006)
Kommentar
Fra : Mogens Hansen


Dato : 20-03-06 18:59


"Niels Dybdahl" <niels@dybdahl.dk> wrote in message
news:441e6ee9$0$27576$edfadb0f@dread11.news.tele.dk...

[8<8<8<]
> Og hvis det drejer sig om hvor mange gange constructorer og destructorer
> bliver kaldt, så tror jeg ikke at compileren må optimere dem væk.

Jo det må den gerne, hvis man ikke kan konstatere nogen forskel ved at gøre
det.

Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407944
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste