プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

組み込み屋さんのC++学習は普通にやっちゃ駄目って話

 周囲の組み込み屋さんを闇のC++プログラマに堕落させたいと目論む訳ですが、組み込み屋さんが普通のC++の教科書を片手にお勉強しちゃ駄目だよねって話。特に取り纏めもないメモ書きなんだけど。

 私はもう流石にC++の入門書は手元にないのですが、例えば、私もかつては書籍を持っていたロベールのC++教室などは、第一章をすっ飛ばすと第二章でクラスの話に入っていく訳です。

 普通それでいいんですけど、組み込みのリソース少ない世界において、オブジェクト指向は不要とまで言い切りはしませんが、必須じゃありません。

 それどころか、new,delete,virtual辺りは害悪と言っても良いでしょう。コンストラクタとかも、場合によっては危険ですね。staticだったり、グローバルな変数の初期化順序とか絡むので。なによりvolatileが絡むとクッソ面倒くさい。

 メモリ小さいから殆どスタックに変数を配置することもないですし、極論を言ってしまえば、組み込みのC++で有効なオブジェクト指向は、デストラクタ以外に特に見当たりません。ステップ数増えるからポインタによる間接参照は極力したくないしね。その辺はコードサイズとの兼ね合いもあるけど。

 

 C言語からの差分でC++を勉強するんだったら、大体、以下の内容を勉強すれば良いんじゃないかなぁ。

 

  1. 組み込みC++で安易に使ってはならない機能
    1. オブジェクト指向
    2. 予約語:new,delete,virtual
    3. STL : string,vector,mapなど、ていうかstd::arrayとstd::tuple以外の殆どのクラス。
    4. staticローカル変数、グローバル変数でコンストラクタを持つデータ使う
  2. extern "C"
  3. 関数
    1. 参照
    2. デフォルト引数
    3. inline関数
    4. constexpr
  4. static_assert
  5. 構造体
    1. staticな変数
    2. staticな関数
    3. 構造体の中で構造体を定義する
    4. デストラクタによるRAII
  6. namespace
    1. using namespace
    2. inline namespace
    3. typedef,using
  7. templateメタプログラミング
    1. 特殊化とか
    2. パック・アンパック
      1. sizeof...
      2. swallow
    3. using
      1. typename,templateの使い方
    4. 型(struct)を用いた静的なポリモーフィズム
    5. tuple,type_traits,utility,initializer_listヘッダ
  8. マクロ
    1. 可変長引数マクロ

 

 ま、何にせよ、普通に学習してstd::coutだの、string、vectorだの、クラスだのを勉強するのは、無駄とは言わないけど、後で良いと思います。