C++ Academy · Lektion

Begrænsninger i embedded: ingen RTTI, ingen exceptions

Arbejd inden for typiske embedded-undersæt, der deaktiverer RTTI og exceptions

Lektion 1 af 414 trin

Begrænsninger i embedded: ingen RTTI, ingen exceptions er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

Indlejret C++

Indlejrede systemer har begrænsninger: begrænset RAM, ingen MMU og deadlines i realtid. C++'s "freestanding"-delmængde fjerner de dele af sproget, der er for dyre.

Hvorfor ingen RTTI?

RTTI (typeinformation ved kørsel) understøtter dynamic_cast og typeid. Hver polymorf klasse indeholder en ekstra pointer, og RTTI-tabeller optager kodestørrelse. Deaktiver det med -fno-rtti.

Hvorfor ingen undtagelser?

Undtagelser kræver tabeller til stack-afvikling og understøttelse ved kørsel — det øger kodestørrelsen og giver uforudsigelige tidsforløb. Mange kodebaser til indlejrede systemer bruger -fno-exceptions.

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

Fejlhåndtering uden undtagelser

Brug:

  • Returkoder (std::expected, std::optional, fejlopregninger)
  • Outputparametre til resultater
  • std::error_code til systemfejl

Resultattyper

C++23 std::expected<T, E> repræsenterer enten en værdi eller en fejl — ligesom Rusts Result. Mange projekter til indlejrede systemer bruger allerede en brugerdefineret Result-type.

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

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

Undgå dynamisk allokering

Fragmentering af heap-hukommelsen ødelægger realtidsegenskaber. I indlejret kode er new ofte forbudt uden for opstart. Brug:

  • Allokering på stakken
  • Statiske arrays
  • Hukommelsespuljer
  • Allokatorer, der er egnet til indlejrede systemer

Mønstre for statisk hukommelse

Reserver hukommelse ved kompilering eller ved opstart.

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);
    // ...
};

Polymorfi ved kompilering

Erstat virtuelle funktioner med templates eller CRTP, når det er muligt — ingen vtable og ingen indirekte kald.

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

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

Freestanding-standardbibliotek

Den freestanding-baserede C++-delmængde udelader det meste af <iostream>, trådunderstøttelse og dynamisk allokering. Standarden definerer udtrykkeligt, hvad der er tilgængeligt.

etl: Embedded Template Library

Embedded Template Library (ETL) leverer STL-lignende containere med en deterministisk størrelse og uden dynamisk allokering.

Bekymringer om kodestørrelse

Brug -Os til størrelsesoptimering, -flto til optimering ved linkning og -ffunction-sections -fdata-sections -Wl,--gc-sections til at fjerne ubrugt kode.

Virkeligheden: Mars-rovere og biler

C++ bruges i stor udstrækning i sikkerhedskritiske indlejrede systemer — inden for bilindustrien (AUTOSAR), luft- og rumfart (MISRA) og medicin (IEC 62304). Kodestandarder begrænser sproget yderligere.

Hurtigt tjek

Hvilket compilerflag deaktiverer understøttelse af undtagelser i C++ for at reducere binærstørrelsen?

Opsummering

Indlejret C++ deaktiverer RTTI og undtagelser af hensyn til kodestørrelse og forudsigelighed. Erstat heap-hukommelse med statisk hukommelse, brug resultattyper til fejl og CRTP til polymorfi. Kodestandarder som MISRA begrænser sproget yderligere.

Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Begrænsninger i embedded: ingen RTTI, ingen exceptions” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Begrænsninger i embedded: ingen RTTI, ingen exceptions”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Begrænsninger i embedded: ingen RTTI, ingen exceptions”?

Arbejd inden for typiske embedded-undersæt, der deaktiverer RTTI og exceptions Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Begrænsninger i embedded: ingen RTTI, ingen exceptions”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Begrænsninger i embedded: ingen RTTI, ingen exceptions
  2. Memory-mapped I/O og volatile
  3. Realtidsovervejelser og latenstid
  4. Krydskompilering til ARM-mål
← Tilbage til C++ Academy