0Pricing
C++ Academy · レッスン

組み込み環境の制約:RTTIなし、例外なし

RTTIと例外を無効にした、一般的な組み込み環境向けサブセットで開発します。

「組み込み環境の制約:RTTIなし、例外なし」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

組み込みC++

組み込みシステムには、限られたRAM、MMUがないこと、リアルタイムの期限といった制約があります。C++の「freestanding」サブセットでは、コストが高すぎる言語機能の一部が除外されています。

なぜRTTIがないのか

RTTI(実行時型情報)はdynamic_castとtypeidをサポートします。ポリモーフィックな各クラスは追加のポインターを保持し、RTTIテーブルはコードサイズを消費します。-fno-rttiで無効にできます。

なぜ例外がないのか

例外にはスタックアンワインディング用のテーブルとランタイムサポートが必要であり、コードサイズが増え、タイミングも予測しにくくなります。多くの組み込みコードベースでは-fno-exceptionsを使用します。

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

例外を使わないエラー処理

次の機能を使用します。

  • 戻り値(std::expected、std::optional、エラー列挙型)
  • 結果を返すための出力引数
  • システムエラー用のstd::error_code

Result型

C++23のstd::expected<T, E>は、値またはエラーのどちらかを表します。RustのResultに似た仕組みです。多くの組み込みプロジェクトでは、すでに独自のResult型を使用しています。

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

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

動的メモリ割り当てを避ける

ヒープの断片化は、リアルタイム処理の大敵です。組み込みコードでは、起動処理以外でのnewを禁止することがよくあります。次の機能を使用します。

  • スタック割り当て
  • 静的配列
  • メモリプール
  • 組み込み向けアロケーター

静的メモリのパターン

コンパイル時または起動時にメモリを確保します。

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

コンパイル時ポリモーフィズム

可能な場合は、仮想関数をテンプレートまたはCRTPに置き換えます。これにより、vtableや間接呼び出しが不要になります。

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

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

Freestanding標準ライブラリ

freestanding C++サブセットでは、<iostream>の大部分、スレッド、動的メモリ割り当てが除外されています。標準では、利用可能な機能が明確に定義されています。

etl:Embedded Template Library

Embedded Template Library(ETL)は、サイズが決定的で動的メモリ割り当てを行わない、STLに似たコンテナを提供します。

コードサイズに関する考慮事項

サイズ最適化には-Os、リンク時最適化には-flto、未使用コードの削除には-ffunction-sections -fdata-sections -Wl,--gc-sectionsを使用します。

実例:火星探査車と自動車

C++は、安全性が重要な組み込みシステムで広く使用されています。たとえば、自動車(AUTOSAR)、航空宇宙(MISRA)、医療(IEC 62304)などです。コーディング規約によって、言語の使用範囲はさらに制限されます。

確認問題

バイナリサイズを削減するために、C++の例外サポートを無効にするコンパイラーフラグはどれですか。

まとめ

組み込みC++では、コードサイズと予測可能性のためにRTTIと例外を無効にします。ヒープを静的メモリに置き換え、エラーにはResult型を使用し、ポリモーフィズムにはCRTPを使用します。MISRAなどのコーディング規約によって、言語はさらに制限されます。

よくある質問

「組み込み環境の制約:RTTIなし、例外なし」レッスンは無料ですか?

はい。「組み込み環境の制約:RTTIなし、例外なし」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「組み込み環境の制約:RTTIなし、例外なし」で何を学びますか?

RTTIと例外を無効にした、一般的な組み込み環境向けサブセットで開発します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「組み込み環境の制約:RTTIなし、例外なし」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 組み込み環境の制約:RTTIなし、例外なし
  2. メモリマップドI/Oとvolatile
  3. リアルタイムにおける考慮事項とレイテンシー
  4. ARMターゲット向けクロスコンパイル
← C++ Academyに戻る