0Pricing
C++ Academy · Lezione

Vincoli nell'embedded: niente RTTI né eccezioni

Lavori all'interno dei sottoinsiemi tipici dei sistemi embedded, che disabilitano RTTI ed eccezioni

Vincoli nell'embedded: niente RTTI né eccezioni è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

C++ embedded

I sistemi embedded hanno vincoli specifici: RAM limitata, assenza di MMU e scadenze in tempo reale. Il sottoinsieme C++ "freestanding" elimina le parti del linguaggio che sono troppo costose.

Perché niente RTTI?

RTTI (Run-Time Type Information) supporta dynamic_cast e typeid. Ogni classe polimorfica contiene un puntatore aggiuntivo e le tabelle RTTI consumano spazio nel codice. Disabiliti RTTI con -fno-rtti.

Perché niente eccezioni?

Le eccezioni richiedono tabelle per lo stack unwinding e il supporto a runtime, aumentando le dimensioni del codice e rendendo imprevedibili i tempi di esecuzione. Molti codebase embedded usano -fno-exceptions.

g++ -fno-rtti -fno-exceptions main.cpp

Gestione degli errori senza eccezioni

Usi:

  • Codici di ritorno (std::expected, std::optional, enumerazioni degli errori)
  • Parametri di output per i risultati
  • std::error_code per gli errori di sistema

Tipi risultato

std::expected<T, E> di C++23 rappresenta alternativamente un valore o un errore, come Result di Rust. Molti progetti embedded usano già un tipo Result personalizzato.

std::expected<int, ErrorCode> parse(const char* s);

if (auto r = parse("42"); r) use(*r);
else                       log_error(r.error());

Evitare l'allocazione dinamica

La frammentazione dell'heap è dannosa per i sistemi real-time. Il codice embedded spesso vieta new al di fuori dell'avvio. Usi:

  • Allocazione sullo stack
  • Array statici
  • Pool di memoria
  • Allocator adatti ai sistemi embedded

Modelli di memoria statica

Riservi la memoria al momento della compilazione o dell'avvio.

template <typename T, size_t N>
class StaticVector {
    alignas(T) char storage_[sizeof(T) * N];
    size_t size_ = 0;
public:
    void push_back(const T& v);
    // ...
};

Polimorfismo a tempo di compilazione

Quando possibile, sostituisca le funzioni virtuali con template o CRTP: in questo modo non servono vtable né chiamate indirette.

template <typename Derived>
class Base {
public:
    void process() { static_cast<Derived*>(this)->process_impl(); }
};

class Concrete : public Base<Concrete> {
public:
    void process_impl() { /* ... */ }
};

Libreria standard freestanding

Il sottoinsieme C++ freestanding esclude gran parte di <iostream>, il threading e l'allocazione dinamica. Lo standard definisce esplicitamente ciò che è disponibile.

etl: Embedded Template Library

La Embedded Template Library (ETL) fornisce container simili a quelli della STL, con dimensione deterministica e senza allocazione dinamica.

Considerazioni sulle dimensioni del codice

Usi -Os per ottimizzare le dimensioni, -flto per l'ottimizzazione al momento del linking e -ffunction-sections -fdata-sections -Wl,--gc-sections per rimuovere il codice inutilizzato.

Nel mondo reale: rover marziani e automobili

C++ è ampiamente usato nei sistemi embedded critici per la sicurezza, in ambito automobilistico (AUTOSAR), aerospaziale (MISRA) e medicale (IEC 62304). Gli standard di codifica impongono ulteriori vincoli al linguaggio.

Verifica rapida

Quale flag del compilatore disabilita il supporto alle eccezioni in C++ per ridurre le dimensioni del binario?

Riepilogo

Il C++ embedded disabilita RTTI ed eccezioni per ridurre le dimensioni del codice e renderne prevedibile l'esecuzione. Sostituisca l'heap con memoria statica, usi tipi risultato per gli errori e CRTP per il polimorfismo. Standard di codifica come MISRA impongono ulteriori restrizioni al linguaggio.

Domande Frequenti

La lezione «Vincoli nell'embedded: niente RTTI né eccezioni» è gratuita?

Sì — il testo completo di «Vincoli nell'embedded: niente RTTI né eccezioni» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Vincoli nell'embedded: niente RTTI né eccezioni»?

Lavori all'interno dei sottoinsiemi tipici dei sistemi embedded, che disabilitano RTTI ed eccezioni Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Vincoli nell'embedded: niente RTTI né eccezioni»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Vincoli nell'embedded: niente RTTI né eccezioni
  2. I/O memory-mapped e volatile
  3. Considerazioni real-time e latenza
  4. Cross-compilazione per target ARM
← Torna a C++ Academy