Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-03-2007, 16:55   #1
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9947
[C] Le variabili globali sono tutte inizzializzate di default del compilatore C?!

In che modo sono inizializzate?!
A 0?! Quindi direi che sono azzerate no?!

Se la risposta è si allora di conseguenza questa dichiarazione globale:

/* Variabili esterne per evitare il passaggio di troppi parametri tra funzioni */
int enclosure=NO, titolo=NO, descrizione=NO;
int count_item=0, canale_numero=0, side_pages=0;
char enclosure_url[SIZEBUF], enclosure_localpath[SIZEBUF];
char enclosure_nomefile[SIZEBUF], enclosure_type[SIZEBUF];
char *descrizione_strptr[MAXLINES], *enclosure_str, *titolo_str, *canale_titolo;

ha il solo scopo di rendere il codice + leggibile ed intuitivo?! Giusto?!
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<<
Più largo è il sorriso, più affilato è il coltello.

Ultima modifica di Matrixbob : 11-03-2007 alle 17:08.
Matrixbob è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 17:30   #2
xorshadow
Member
 
L'Avatar di xorshadow
 
Iscritto dal: Feb 2007
Messaggi: 38
In C nessuna area di memoria viene inizializzata automaticamente. Al momento della creazione di un buffer(o di una variabile) statico o dinamico, questo contiene valori non predicibili.
Per fare quello che tu vorresti, protresti incapsulare la variabile globale all'interno di una funzione dichiarando la stessa variabile come static e quindi iniziallizzarla e ritornarla.
xorshadow è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 17:49   #3
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Matrixbob Guarda i messaggi
/* Variabili esterne per evitare il passaggio di troppi parametri tra funzioni */
No, è assolutamente stilisticamente brutto.
Se devi passare troppe variabili è possibile che tu abbia progettato male la suddivisione in funzioni. Ad esempio potresti aver funzioni troppo lunghe.
Se ciò non è vero potresti raggrupparle in strutture e passare la sola struttura.

Le variabili globali solitamente sono inizializzate a 0, ma non sono sicuro che sia obbligatorio, anzi, credo che sia una di quelle cose che lo standard lascia all'implementazione del compilatore.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 18:17   #4
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9947
OOOK, il prossimo programma gli starò attento.
Ormai è quello che è e da qui devo andare avanti.
CMQ anche sul Kernigan lo dice.

Quello della inizializzazione invece non ne sono sicuro, ma l'avevo letto da qualche parte.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<<
Più largo è il sorriso, più affilato è il coltello.
Matrixbob è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 18:46   #5
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Molti compilatori lo fanno, ma non è detto che lo facciano tutti
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 18:51   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Matrixbob Guarda i messaggi
CMQ anche sul Kernigan lo dice.
Il K&R ha anche 40 anni
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 18:54   #7
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9947
Cionci farò esperienza e migliorerò, anche grazie al vostro aiuto.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<<
Più largo è il sorriso, più affilato è il coltello.
Matrixbob è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 18:54   #8
xorshadow
Member
 
L'Avatar di xorshadow
 
Iscritto dal: Feb 2007
Messaggi: 38
Quote:
Molti compilatori lo fanno, ma non è detto che lo facciano tutti
Oltre a non farlo tutti, quelli che lo fanno ti stanno solo facendo un favore!
Se poi cerchi di compilare con qualche opzione di ottimizzazione della velocità puoi star certo che nessun compilatore ti inizializzarà niente.
E ci sono dei motivi dietro:
1) E' costoso
2) E' inutile, perchè il compilatore non può sapere a priori quale è il valore di default di una variabile perchè non sa quale semantica rappresenta.
Quindi dare per scontata l'inizializzazione della memoria è un errore di programmazione.

Ultima modifica di xorshadow : 11-03-2007 alle 19:05.
xorshadow è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 19:26   #9
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Al contrario, l'inizializzazione a zero è a costo zero, perché il valore dell'inizializzazione delle variabili globali e statiche viene automaticamente caricato dall'immagine dell'eseguibile.
Semplicemente durante la creazione della parte riguardante i dati all'interno dell'eseguibile, il valore delle variabili non inizializzate viene impostato a zero.

Comunque non sono sicuro che lo imponga lo standard, l'unica cosa è questa.

Ultima modifica di cionci : 11-03-2007 alle 19:28.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 20:02   #10
xorshadow
Member
 
L'Avatar di xorshadow
 
Iscritto dal: Feb 2007
Messaggi: 38
Quote:
Originariamente inviato da cionci Guarda i messaggi
Al contrario, l'inizializzazione a zero è a costo zero, perché il valore dell'inizializzazione delle variabili globali e statiche viene automaticamente caricato dall'immagine dell'eseguibile.
Se carica un valore di inizializzazione vuol dire che la variabile viene inizializzata, e se non sbaglio non si sta parlando di questo, anzi si sta parlando del contrario, cioè se NON viene inizializzata.
Comunque, se la variabile non è esplicitamente inizializzata nel codice sorgente, quando viene caricato l'eseguibile, viene semplicemente riservato (ma non viene assolutamente ne letto ne scritto) dello spazio in memoria per tale variabile.

Quote:
Originariamente inviato da cionci Guarda i messaggi
Semplicemente durante la creazione della parte riguardante i dati all'interno dell'eseguibile, il valore delle variabili non inizializzate viene impostato a zero.
E questo ha un costo ovviamente. Impostare qualcosa costa di più del NON impostare.

Ultima modifica di xorshadow : 11-03-2007 alle 20:06.
xorshadow è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 20:31   #11
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
non ho letto tutti i post ma dico la mia sperando di non essere ripetitivo: non devi assolutamente affidarti al fatto che le variabili (globali o non) in C vengano inizializzate automaticamente a zero o qualche altro valore perché afaik lo standard non prevede nessuna inizializzazione implicita.

aldilà di questo però posso dirti che, per cause dovute al funzionamento del compilatore e di Windows stesso, accade che quando compili un .exe per Windows le variabili globali non inizializzate sono quasi sempre inizializzate come aree di memoria completamente azzerate. ma vedila solo come una curiosità tecnica, anche perché vale solo per le variabili globali e non per quelle locali, che spesso invece assumono valori difficilmente predictable.

PS: di Linux non so nulla in merito

Ultima modifica di 71104 : 11-03-2007 alle 20:37.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 20:34   #12
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Chiariamo che si parla solo di variabili globali e statiche. Per questo nell'eseguibile c'è una sezione dedicata a queste variabili e tutte vengono inizializzate, anche quelle che non lo sono con valore pari a zero.
Questo proprio per una questione di prestazioni, immaginati questa situazione:

int x = 0;
int y;
int z = 0;

Come codifichi nell'eseguibile questa situazione ?
Ci possono essere due scelte:
- riservare 12 byte ed inizializzare x e z a runtime
- scrivere 12 byte nell'eseguibile che descrivono il valore di tutte le variabili (anche quelle non inizializzate, assegnandogli un valore scelto, zero in molti casi) e prendere tutto il blocco e metterlo in memoria

La prima necessita anche che ci sia del codice che inizializza le variabili a runtime. Quindi c'è, oltre allo spazio e al tempo necessario per caricare in memoria il codice che deve inizializzare le variabili, anche il tempo perso nell'esecuzione delle istruzioni. Fai conto che un semplice mov memoria, valore sono 1 byte di opcode, 4 byte per l'indirizzo della memoria e 4 byte per il valore e questo per ogni variabile da inizializzare.

La seconda è la più semplice e la più veloce perché consente di trasferire in burst direttamente TUTTA l'immagine dell'eseguibile in memoria (ovviamente se non c'è bisogno di un caricamento rilocante). Infatti visto che devo trasferire già il codice trasferire anche i dati ha un costo minimo.

Il riservare spazio si fa soltanto per le variabili locali...quelle sì che mantengono il valore che c'era prima nelle rispettive locazioni dello stack che sono state loro riservate.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 20:34   #13
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ah, e dimenticavo: per il C++ invece il discorso è molto diverso in quanto una variabile potrebbe essere di tipo class, ed in tal caso esiste un'inizializzazione implicita dovuta al costruttore. però credo che tu non possa fare affidamento all'inizializzazione dei campi di quella classe non esplicitamente inizializzati nel costruttore.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 20:53   #14
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9947
A me a scuola han detto come a Cionci.
Anche 71XXX ha notato che di fatto in Winzoz succede.
Succede anche in Linux/Unix.

La faccenda del costono lasciamola perdere perchè la complessità spaziale e temporale va considerata asintoticamente.
Praticamente quelle poche istruzioni sono insignificanti.

CMQ io inizializzo anche le globali.
Poi ci penserà il compilatore a sistemare tutto.

[PS]
CMQ il C mi sta martoriando le balle.
Quando finirò il progetto spero di non toccarlo +.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<<
Più largo è il sorriso, più affilato è il coltello.

Ultima modifica di Matrixbob : 11-03-2007 alle 20:56.
Matrixbob è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 20:56   #15
xorshadow
Member
 
L'Avatar di xorshadow
 
Iscritto dal: Feb 2007
Messaggi: 38
Quote:
Originariamente inviato da cionci Guarda i messaggi
Chiariamo che si parla solo di variabili globali e statiche. Per questo nell'eseguibile c'è una sezione dedicata a queste variabili e tutte vengono inizializzate, anche quelle che non lo sono con valore pari a zero.
Anche le variabili globali e statiche vengono create nello stack (non credo proprio che vengano create nello heap o nell'area del codice o peggio nell'area dati in cui ci sono dati "costanti" e non variabili).
Non confonderti con le variabili costanti.
xorshadow è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 21:02   #16
Matrixbob
Senior Member
 
L'Avatar di Matrixbob
 
Iscritto dal: Jul 2001
Messaggi: 9947
Quote:
Originariamente inviato da xorshadow Guarda i messaggi
Non confonderti con le variabili costanti.
Le DEFINE?!
No no io mi ricordo che insegnavano le VAR globali.
__________________
Aiuta la ricerca col tuo PC: >>Calcolo distribuito BOINC.Italy: unisciti anche tu<<
Più largo è il sorriso, più affilato è il coltello.
Matrixbob è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 21:07   #17
xorshadow
Member
 
L'Avatar di xorshadow
 
Iscritto dal: Feb 2007
Messaggi: 38
Quote:
Originariamente inviato da Matrixbob Guarda i messaggi
A me a scuola han detto come a Cionci.
Cioè? Voglio sapere quale cosa in particolare.

Quote:
Anche 71XXX ha notato che di fatto in Winzoz succede.
Succede anche in Linux/Unix.
Sul fatto che può succede siamo d'accordo tutti. Ma nessun programmatore serio si affiderebbe ad un "può succedere che il mio programma vada bene".

Quote:
La faccenda del costono lasciamola perdere perchè la complessità spaziale e temporale va considerata asintoticamente.
Praticamente quelle poche istruzioni sono insignificanti.
Il costo era per spiagare il perchè non vengono inizializzate e comunque, anche l'inizializzazione può avere un peso se rapportato all'enorme numero di variabili di un programma.
xorshadow è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 21:09   #18
xorshadow
Member
 
L'Avatar di xorshadow
 
Iscritto dal: Feb 2007
Messaggi: 38
Quote:
Originariamente inviato da Matrixbob Guarda i messaggi
Le DEFINE?!
No no io mi ricordo che insegnavano le VAR globali.
Chi ha parlato di DEFINE?
Parlo di cose del tipo
Codice:
const int blabla;
xorshadow è offline   Rispondi citando il messaggio o parte di esso
Old 11-03-2007, 21:14   #19
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da Matrixbob Guarda i messaggi
Anche 71XXX ha notato che di fatto in Winzoz succede.
succede a causa di una particolarità (documentata!) nel meccanismo dell'allocazione delle pagine di memoria virtuale in Win32: le pagine allocate sono inizializzate a zero, cioè sono sempre completamente azzerate. le variabili globali (o locali statiche) non inizializzate di un eseguibile risiedono solitamente in particolari sezioni dell'eseguibile che hanno raw size = 0 e virtual size > 0 (ovvero: nel file non occupano spazio, ma nell'immagine in memoria dell'eseguibile si); questo fa si' che le pagine dedicate a quelle sezioni non subiscano nessuna inizializzazione se non quella da parte di Windows dovuta appunto alla loro allocazione.

ora vedo se ritrovo in MSDN la parte che documentava l'inizializzazione delle pagine di memoria virtuale...

EDIT - ecco qua: http://msdn2.microsoft.com/en-us/library/aa366887.aspx (leggere le primissime righe)
vero è che si potrebbe anche precisare che l'inizializzazione è documentata relativamente a quella funzione, e non al kernel; di conseguenza non si può fare affidamento sull'"inizializzazione implicita" in un ipotetico sistema che supporti Win32 per compatibilità; e aldilà di questo troppi sono i meccanismi che stanno dietro all'azzeramento implicito delle variabili non inizializzate, tutti meccanismi che potrebbero teoricamente (anche se poco probabilmente) cambiare e che riducono comunque la portabilità dei tuoi sorgenti, e sui quali quindi non puoi basarti. ribadisco: prendi tutto questo come una curiosità tecnica

Ultima modifica di 71104 : 11-03-2007 alle 21:20.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 12-03-2007, 10:19   #20
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da 71104 Guarda i messaggi
le variabili globali (o locali statiche) non inizializzate di un eseguibile risiedono solitamente in particolari sezioni dell'eseguibile che hanno raw size = 0 e virtual size > 0 (ovvero: nel file non occupano spazio, ma nell'immagine in memoria dell'eseguibile si); questo fa si' che le pagine dedicate a quelle sezioni non subiscano nessuna inizializzazione se non quella da parte di Windows dovuta appunto alla loro allocazione.
Su linux è più o meno la stessa cosa, i dati non inizializzati finiscono in una regione elf chiamata BSS che serve appunto a questo.
Di norma questa regione è inizializzata a 0 (guai se non fosse inizializzata! Perché? ), e gli ultimi gcc anzi spostano di default le inizializazzioni esplicite a 0 in BSS.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Samsung TV in offerta su Amazon: Neo QLE...
Sì, c'è un display è...
Fast restart di Windows spiegato 30 anni...
Il mondo piange Gladys West, la matemati...
Tomb Raider: Catalyst, il cast si allarg...
Renault Group chiude un ottimo 2025: Dac...
A questo prezzo la Blink Mini è difficil...
DJI Mini 4 Pro Fly More a 859€ su Amazon...
realme P4 Power avrà una batteria...
Marathon: data di uscita, edizioni e tut...
Dojo 3 riparte: Tesla affida a Intel il ...
Smartphone e attenzione in frantumi: Mat...
Aerei costruiti da robot umanoidi? L'eur...
Chery prende tutti in contropiede: batte...
Il colpo silenzioso di Intel: arriva l'u...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:58.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v