Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12

Discussione: [C] - Cicli iterativi.

  1. #1

    [C] - Cicli iterattivi.

    Salve, volevo sapere come si comporta un compilatore C (precisamente il gcc) davanti ad un ciclo iterattivo (per esempio il for).

    Più precisamente vorrei sapere questo:

    codice:
    for (i = 0; i < strlen(stringa); i++)
     istruzione..
    codice:
    l = strlen(stringa);
    for (i = 0; i < l; i++)
     istruzione..
    La domanda quindi è:
    La funzione per il calcolo della lunghezza di una stringa il compilatore la ripete ogni volta, oppure se la tiene in memoria da qualche parte?

    Grazie per le risposte

  2. #2
    Utente di HTML.it L'avatar di minoz
    Registrato dal
    Oct 2001
    Messaggi
    219
    Nel primo caso la tiene temporaneamente in memoria senza ricalcolarla ogni volta, mentre nel secondo la assegni direttamente alla variabile l...

    Infatti se nel primo caso all'interno del ciclo modificassi la variabile stringa, il valore di terminazione del ciclo non verrebbe modificato...

  3. #3
    guarda che ti stai confondendo parecchio... questo è quello che succede nel ciclo:

    1) i viene settato a 0
    2) [cycle]
    viene invocata la funzione strlen() su stringa e viene restituito un valore; questi viene comparato con i. Se i è maggiore o uguale al valore ritornato allora il ciclo termina, altrimenti viene eseguita l'istruzione e successivamente i viene incrementato di 1. Il ciclo viene ripetuto. Come vedi, il valore di ritorno di strlen() non viene salvato da nessuna parte ma viene calcolato ogni volta.

    Nel secondo caso invece:

    1) ad l dai il valore del ritorno di strlen() su stringa.
    2) i viene settato a 0
    3) [cycle]
    se i è maggiore o uguale ad l il ciclo viene interrotto, altrimenti viene eseguita l'istruzione e successivamente i viene incrementato di uno. Come vedi qui si che viene salvata sullo stack (all'indirizzo di l) il valore di ritorno di strlen().

    La seconda versione sarà più veloce della prima ma occuperà più spazio in memoria.

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  4. #4
    Grazie TheGreatWorld.
    Ma tua quale avresti usato delle due (se posso chiedertelo)?

  5. #5
    Ma tua quale avresti usato delle due (se posso chiedertelo)?
    OLMO!!!

    E` ovvio che si usa la seconda se la strlen() in questione e` costante, perche` non ha senso ricalcolarla ad ogni ciclo. Se invece il risultato puo` cambiare, la prima via non solo e` corretta, ma e` l`unica corretta delle due.

    Sul fatto del "temporaneamente in memoria" non si puo` fare affidamento, ma e` probabile che un compilatore capace di ottimizzare possa riportare il primo codice al secondo, o quantomeno a qualcosa di simile.

    Cmq 'iterativi' con una 't' sola.

  6. #6
    Utente di HTML.it L'avatar di minoz
    Registrato dal
    Oct 2001
    Messaggi
    219
    Secondo me in quanto spazio occupato nella memoria sono uguali in quanto nel primo caso lo spazio viene riservato in fase di esecuzione nel momento in cui compare l'istruzione strlen() e liberato solo alla fine del ciclo, mentre nel secondo caso si assegna spazio alla variabile l alla quale viene poi assegnato il valore restituito da strlen().. In quanto a velocità di esecuzione penso sia più veloce il secondo

  7. #7
    codice:
    l = strlen(stringa);
    for (i = 0; i < l; i++)
     istruzione..
    Sicuramente questa è più ottimizzata in quanto la funzione strlen è calcolata una sola volta. Questo tipo di ottimizzazione sembra stupida ma con loops molto grandi e magari in ambiti come la grafica 3d queste ottimizzazione possono fare la differenza!

  8. #8
    Dexterp ha ragione, in programmi mission critical ottimizzazioni all'apparenza stupide possono fare la differenza.

    Minoz ho capito che vuoi dire ma non è la stessa cosa. Quello che vuoi dire (credo) è che cmq all'interno della funzione strlen() viene salvato il risultato che alla fine viene ritornato. Questa è una considerazione esatta ma del tutto inutile: quando strlen() termina la memoria allocata per la var da ritornare viene resa disponibile per altre variabili. Ribadisco quanto detto prima, la seconda e' più veloce ma occupa più spazio.

    Per quanto riguarda l'uso dipende dai casi. Di norma userei la prima, ma la seconda si rivela importante nel caso di programmi che necessitino di una velocità di esecuzione particolare.

    r0x: tu nel secondo dichiari una variabile in più, come lo metti metti un compilatore qualsiasi prp quel pezzo non lo può ottimizzare.

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  9. #9
    TGW, se quella strlen() ritorna una costante, stai sicuro che probabilmente il codice del primo si riporta al secondo. Ad esempio, memorizzando il risultato in cx. Certo e` che l`"intelligenza" di un compilatore ha un limite, e magari non ci arriva, ma non saprei. Bisognerebbe provare con mano. Cmq ripeto, la prima ipotesi, per un risultato costante, e` da scartare, SEMPRE. L`efficienza va assicurata sia per programmi stupidi che complessi, non e` mai un optional.

  10. #10
    r0x: il fatto è che il compilatore non sà se strlen ritorni una costante o no... cioè, il compilatore genera il codice a secondo di ciò che è presente nel sorgente, ma se la variabile stringa è allocata runtime (magari come input da user) e si chiama più volte strlen come può dire che è uguale se nn è programmato per farlo? magari quello che tu dici sarebbe possibile con cache (ipotizzo, non sò)... cmq forse sbaglio, è solo una mia ipotesi questa

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.