Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    23

    Switch e valutazione dell'espressione di selezione

    Salve,
    mi chiedevo se il valore delll'espressione di selezione di una switch viene valutato ad ogni clausola oppure viene memorizzato in una locazione di memoria e poi confrontato con le clausole, ovvero:

    codice:
    switch (funzione(parametro))
    {
      case VALORE_1:
        ...
        break;
      case VALORE_2:
        ...
        break;
    }
    codice:
    valore = funzione(parametro);
    
    switch (valore)
    {
      case VALORE_1:
        ...
        break;
      case VALORE_2:
        ...
        break;
    }
    i due codici sono identici? Cioe': nel secondo caso e' ovvio che il valore restituito dalla funzione viene memorizzato in una determinata locazione di memoria e poi le clausole della switch vengono confrontate con tale locazione; mentre quello che non mi e' chiaro e' se nel primo caso la funzione viene richiamata ad ogni clausola oppure all'inizio della switch il valore restituito dalla funzione viene temporaneamente memorizzato e poi confrontato con le clausole...

  2. #2
    Bella domanda
    Per me la funzione viene valutata solo una volta in entrambi i casi...aggiungerei che il compilatore è abbastanza furbo di generare lo stesso asm nei due casi.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,468
    Il codice assembler generato da VC++ 2003 (in modalita' debug) e'

    codice:
      00025	8b 45 f8	 mov	 eax, DWORD PTR _p$[ebp]
      00028	50		 push	 eax
      00029	e8 00 00 00 00	 call	 ?f@@YAHH@Z		; f
      0002e	83 c4 04	 add	 esp, 4
      00031	89 85 30 ff ff
    	ff		 mov	 DWORD PTR tv66[ebp], eax
      00037	83 bd 30 ff ff
    	ff 01		 cmp	 DWORD PTR tv66[ebp], 1
      0003e	74 0b		 je	 SHORT $L10444
      00040	83 bd 30 ff ff
    	ff 02		 cmp	 DWORD PTR tv66[ebp], 2
      00047	74 11		 je	 SHORT $L10446
      00049	eb 1c		 jmp	 SHORT $L10441
    da cui appare evidente che viene usata una "variabile" temporanea (nell'esempio e' la tv66 ...). In modalita' Release la situazione e' analoga. A volte puo' essere utilizzato un registro della CPU (dipende dall'ottimizzazione).

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 © 2024 vBulletin Solutions, Inc. All rights reserved.