RXマイコン、C++、std::function クラスの謎

FTPサーバーの次は、HTTPサーバーも実装しているが、まだ機能が不足
している、順次機能追加していく。

登録タスクの実行としくみ:
組み込みマイコンで動かすサーバーでは、固定されたページを単に送るだけで
は無く、状況により動的に生成した構文を送る事ができる。
その際、リンクパスと、関連する実行関数を登録出来ると、非常に利便性が高
い。

C++11 から導入された、「std::function」テンプレートは、関数ポインタでも、
ラムダ式でも、クラスのメンバーでも何でも登録できる、便利な物だが、何らか
の要因により、コンパイル、リンク後の使用メモリーが巨大になる現象が発生し
ている・・・

#include <functional>

typedef std::function< void () > http_task_type;

http_task_type	task_;

void aaa()
{
    if(task_) {
        task_();
    }
}

※関数呼び出しが1箇所の場合

   text    data     bss     dec     hex
 115676   71804   79388  266868   41274
void aaa()
{
    if(task_) {
        task_();
    }
}

void bbb()
{
    if(task_) {
        task_();
    }
}

※関数呼び出しが2箇所になった場合

   text    data     bss     dec     hex
 515860  106844   84148  706852   ac924

実行バイナリーは500K増え、RAMも40K増えている・・
RX64M のメモリーは潤沢なので、それでも問題は無いが、納得は出来ない。

組み込みマイコンでC++を使う場合の難点は、巨大なクラスを使えない(使わ
ない)事で、あらかじめ判っている事として、「iostream」関係がある。
(1)「iostream」を使わない場合

   text    data     bss     dec     hex
  86708      48   20988  107744   1a4e0

(2)「iostream」を使った場合

   text    data     bss     dec     hex
 528228  108620   27936  664784   a24d0

※なので、それに代わる「format」、「input」クラスなどを実装している。

どうやら、「std::function」は、何らかの場合に、「iostream」の機能を使うら
しい・・・
※「例外」と「rtti」は無効にしている。
※ソースコードを詳細に追っていないので、明確には判らないが・・・
※コードは巨大で複雑なので、時間が出来た時にでも調査する事にするが、とりあ
えず、巨大にならないように工夫して実装するしか無い。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください