組み込み環境の制約: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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 組み込み環境の制約:RTTIなし、例外なし
- メモリマップドI/Oとvolatile
- リアルタイムにおける考慮事項とレイテンシー
- ARMターゲット向けクロスコンパイル