Prima di tutto, "definire" e "dichiarare" sono cose che fai nel codice sorgente, piuttosto che in fase di runtime. Alcune dichiarazioni e definizioni di variabili corrispondono al codice macchina effettivo che viene eseguito, mentre altre no. Per quanto ne so, la definizione di un parametro funzione aggiuntivo o di una variabile locale non genererà alcun codice macchina aggiuntivo, ma cambierà semplicemente il numero di byte che i puntatori frame / stack / etc della CPU vengono spostati come parte della chiamata alla funzione.
Ciò che è vero è che la memoria per un parametro di funzione viene allocata nello stack ogni volta che viene chiamata tale funzione (dai puntatori sopra menzionati che vengono spostati), mentre la memoria per una variabile globale viene allocata solo una volta. In questo senso hai assolutamente ragione. Ma la memoria allocata da quelle chiamate di funzione sarà immediatamente deallocata quando la funzione termina, mentre la memoria della variabile globale deve restare in piedi per l'intera lunghezza del programma. In questo senso "verrà utilizzata più memoria" non è proprio corretto.
Naturalmente, questo sarebbe un motivo molto sciocco per usare una variabile globale , perché qualsiasi modifica nell'uso della memoria o nelle prestazioni di runtime è probabile che sia estremamente piccola o totalmente inesistente, aggiungendo al contempo variabili globali non serve solitamente a rendere i programmi molto più fragili e non testabili a lungo termine (vedi Perché lo stato globale è così malvagio? per ulteriori informazioni al riguardo). Sicuramente non farlo a meno che non abbiate dati concreti dagli strumenti di profilazione che mostrano che la variabile globale "ottimizzazione" è in realtà una grande vittoria sulle prestazioni della variabile locale.