Statico rispetto a non statico nei sistemi incorporati [duplicato]

-1

Sto scrivendo applicazioni C ++ nell'area embedded. Molte volte penso che dovrei usare una variabile const statica o non statica nelle funzioni / metodi? Ecco i miei pensieri:

  1. La variabile costante statica mangia memoria mentre l'app è in esecuzione, questo porta a un maggiore consumo di memoria e meno memoria disponibile sul dispositivo.

  2. La variabile costante non statica mangia la memoria solo quando viene chiamata la funzione / metodo perché verrà allocata nello stack, ma utilizzerà un processore per l'allocazione e l'inizializzazione.

Quindi, ho deciso di non usare static s quando possibile. Lo faccio giusto o almeno ottimale?

    
posta Victor Polevoy 12.07.2017 - 10:29
fonte

2 risposte

4

Questa è in realtà la cosa peggiore da fare perché non si sa mai quali risorse saranno necessarie in tutti i casi, il che significa che il tuo codice può bloccarsi nel mondo reale quando è stato corretto nei test. Significa anche che se si tenta di eseguire il debug con un indirizzo di memoria specifico ICE non eseguire il mapping a funzioni o variabili specifiche che è un incubo.

La migliore pratica nel mondo embedded è di rendere tutto ciò che è statico e inizialmente const quindi rilassare solo il const su quelle cose che devi .

Dovresti anche, almeno durante il debug delle ottimizzazioni impostate su 0 (disattivato).

Questo significa che:

  • Quando hai la tua immagine, sai esattamente di quanto spazio ha bisogno.
  • Tutti i metodi e le variabili hanno indirizzi assoluti che consentono il debug con strumenti come un ICE, (nell'emulatore di circuito).
  • Se si scopre che il tuo codice non si adatta allo spazio disponibile sul sistema di destinazione allora puoi prendere in considerazione la possibilità di risparmiare spazio (a costo di una certa velocità), rimuovendo parte del modificatori statici, (il file di mappa ti aiuterà a identificare quelli che stanno usando il maggior spazio e il profiler ne restituisce quelli che sono meno usati). Potresti, ad esempio, avere dei pezzi grandi che sono solo utilizzato durante l'inizializzazione o solo in modalità debug che può rimuovere la statica senza eccessivo impatto negativo.

Una piccola spiegazione

Che cos'è la parola chiave static in realtà e fa:

  • static è ciò che è noto come istruzione di modifica dello storage.
  • Istruisce il compilatore, il linker e l'amp; localizzatore per pre-allocare la posizione di archiviazione anziché allocarla dinamicamente.
  • Modifica anche l'inizializzazione degli elementi locali, se vengono inizializzati quando dichiarati , vengono inizializzati al momento del caricamento non ogni volta che viene inserita una funzione. Quindi se una funzione contiene una dichiarazione static int counter = 0 e incrementa il contatore di 1 per ogni chiamata, l'inizializzazione allora il contatore crescerà con ogni chiamata, (senza statico non verrebbe mai sopra 1).
  • Come con qualsiasi cosa static ha lati più e meno:
    • L'uso dello statico di solito rende il codice più veloce, (dato che la voce di una funzione o di un metodo non richiede allocazione di memoria nello stack o heap) e le operazioni di lettura / scrittura accedono a uno specifico indirizzo noto piuttosto che dover guardare su una posizione stack / heap (indirizzamento diretto vs indiretto). PLUS
    • Potrebbe verificarsi un leggero aumento del tempo di caricamento iniziale, (nel codice incorporato questo è normalmente molto piccolo). MINUS
    • Nella programmazione incorporata, poiché la posizione effettiva degli elementi è determinata al momento della compilazione, questo sarebbe compilare, collegare, individuare, strumenti hardware come un In Circuit Emulator, (ICE), può lasciare si esaminano i valori, lo stato, ecc. del codice mentre è in esecuzione con un impatto minimo sulla velocità di esecuzione (diversamente da un debugger che di solito ha un impatto maggiore sulla velocità). PLUS
    • Poiché tutte le risorse sono pre-allocate, le risorse devono sempre essere almeno il massimo richiesto. Questo è sia PLUS / MINUS
    • Non puoi farla franca con una quantità di memoria inferiore al totale richiesto, il che aumenta i tuoi requisiti MINUS
    • Non incontrerai mai una situazione in cui eseguire una sequenza di operazioni in un ordine o con un set di valori fa crashare il programma e non in altri. PLUS
    • Dato che al momento della costruzione si sa che se si stanno superando le risorse disponibili è possibile aggiornare i requisiti hardware richiesti o ottimizzare il codice per ridurre lo spazio di archiviazione richiesto. PLUS
    • I valori locali persistono tra le chiamate in modo da poter implementare facilmente cose come contatori senza avere variabili di ambito globale PLUS
    • I valori locali persistono tra le chiamate, quindi è necessario ricordarsi di reimpostarli esplicitamente, (non nella dichiarazione), MINUS
    • Se quasi tutto è stato dichiarato statico, il tuo heap & i requisiti di stack diminuiscono notevolmente, ottenendo così un risparmio di risorse, PLUS
risposta data 12.07.2017 - 10:44
fonte
1
  1. Non c'è motivo di ottimizzazioni premature.
  2. In c ++ alcune statiche non usano la memoria. Nell'esempio seguente, maxInstances non usa la memoria nemmeno quando è compilata con -O0.

    classe A { pubblico:     static size_t const maxInstances = 10;     ... }

risposta data 12.07.2017 - 14:27
fonte

Leggi altre domande sui tag