In un linguaggio come C o C ++, i semplici tipi nativi come int, char, float, double nelle architetture complete con hardware in virgola mobile possono in genere diventare istruzioni sequenziali della macchina come le altre istruzioni nel blocco di codice.
In un'architettura che non ha hardware in virgola mobile nativo (o anche inte a 32 bit), le espressioni semplici possono generare chiamate di subroutine per eseguire librerie temporali che integrano le funzionalità di base del dispositivo. Ho fatto un esperimento con alcuni otto bit micros contro un compilatore X86 alcuni anni fa e ho trovato grandi differenze nella dimensione del codice generato. x86 era grande 1/3 e, a differenza delle architetture a 8 bit che avevano molte richieste di runtime per cose semplici come l'aggiunta di interi a 32 e 64 bit, tutto era generato da sequenze di istruzioni.
Spesso le costanti sono inserite con le istruzioni come operandi immediati. In alcune architetture, i dati immediati verranno inseriti nello stack o scritti rispetto a un puntatore allo stack o a un puntatore di base. In un eseguibile, le istruzioni inserite e gli operandi immediati saranno in genere nel segmento di codice. Per dati complessi come array, stringhe e variabili definite dall'utente, se sono costanti, possono essere emessi anche in un segmento di codice, ma ciò che è più comune è che durante il runtime vengono copiati in un segmento di dati inizializzato dal caricatore o il sistema di runtime.
I compilatori dispongono di molti metodi per l'ottimizzazione delle espressioni, quindi se esegui un passo singolo e vedi quelle che sembrano pochissime istruzioni relative a un'espressione, potrebbe significare che le costanti nell'espressione sono state semplificate. C'è anche una tecnica in cui le sottoespressioni comuni vengono valutate una volta prima del primo utilizzo, quindi quando è necessario di nuovo, il risultato parziale è appena usato da una variabile temporanea o da un registro.
Questo gruppo, o Analisi del codice di scambio dello stack, potrebbe essere un'ottima occasione per spiegare cosa sta succedendo se hai ulteriori domande su un blocco di codice sorgente e sulle istruzioni della macchina che genera, in particolare per quanto riguarda le ottimizzazioni del compilatore.
Quando gli operatori o le espressioni vengono utilizzati con tipi di dati complessi come array, stringhe, strutture o classi, potrebbero esserci alcuni casi in cui le operazioni vengono eseguite in sequenza, ma in genere i tipi più complessi richiedono chiamate di funzioni. Un'eccezionale eccezione a questo è quando un compilatore fornisce estensioni OpenMP che eseguono il parallelismo a grana fine su piccoli blocchi di codice che vengono inviati su più core. Per quanto interessante possa essere, i dettagli sono probabilmente fuori portata per questa domanda.