|
| 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
| |
|
|