IfNotFalseTrue ha scritto:
Però molto spesso è una buona pratica, prendiamo ad esempio questa funzione, proviene dal kernel Linux:
static int acpi_thermal_get_temperature(struct acpi_thermal *tz)
{
acpi_status status = AE_OK;
Ora al di là del codice che è anche semplice da seguire, nota come la variabile status venga inizializzata
Questo thread tratta la questione se inizializzare variabili
locali, visto il rischio che vengano
utilizzate con il loro contenuto originale, cioè la spazzatura che di solito si trova nello stack frame. E ci sono due posizioni:
1. Gli esperti dicono che bisogna sempre inizializzare, quindi
int tmp=0;
2. I dilettanti (=io) dicono che è compito del compilatore segnalare se una variabile locale viene utilizzata senza essere inizializzata.
Nel tuo caso, la variabile è
globale e quindi contiene quello che altre parti del programma ci hanno messo dentro. Visto che è un valore "status", ha ovviamento un senso metterci un valore default, ma questo è un altro tema.
P.S.: Già che ci siamo, ecco uno sguardo al livello più "sotto"...
static long long foo(void)
{
int mylocal = 123;
unsigned long long tmp;
return 0x12345678;
}
Ed ecco come GCC traduce questa funzione:
Address Hex dump Command Comments
00401340 Ú$ 55 push ebp ; entry a foo
00401341 ³. 89E5 mov ebp, esp ; crea stack frame
00401343 ³. 83EC 10 sub esp, 10 ; crea variabili locali mylocal e tmp
00401346 ³. C745 FC 7B000000 mov dword ptr [ebp-4], 7B ; metti 123 in mylocal
0040134D ³. B8 78563412 mov eax, 12345678 ; lo dword retval
00401352 ³. BA 00000000 mov edx, 0 ; hi dword
00401357 ³. C9 leave
00401358 À. C3 retn
Nessun codice per tmp, ma assegnare 123 a mylocal costa inutilmente 7 bytes. Se lo fai per un milione di righe, allora hai una spiegazione perché troviamo sempre più bloatware sui nostri pc (ovviamente gli esperti ci diranno che RAM non costa niente, e che cercare
performance hit instruction cache su Google è solo uno spreco di tempo prezioso).