スポンサーサイトC++で書いたHello, World!はなぜデカいか?

Home > ----- / スポンサー広告 > This Entry 2009-04 / 実装技術 > This Entry [com : 0][Tb : 0]

--------

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2009-04-27

FC2ブログはすぐに「スポンサーサイト」にされてしまうので、保守の意味でも、今回はよく受ける質問から「C++で書いたHello, World!はなぜデカいか?」について書いてみることにします。

C++でstd::coutを使ったHello, World!を書くと、驚くほどプログラムサイズが大きくなってしまいます。リンカが出力するマップファイルをみるなどすれば分かりますが、使ってもいない関数が大量にリンクされていると思います。これは一体何なのでしょうか?

std::coutというか、std::basic_ostreamクラステンプレートでは、文字列を出力する際に、内部的にstd::codecvtファセットという機能を用います。これは、主に文字コードを変換するためのものです。例えば、プログラム内部ではUTF-8を使うけれども、外部に出力する際にはシフトJISにしないといけない場合には、ファセットの機能を用いて文字コードの変換を行うわけです。

また、数値と文字列の変換には、std::num_getやstd::num_putファセットが必要になります。その他にも、何種類かのファセットが定義されています。これらのファセットは、std::localeクラスおよびその派生クラスが持っているわけですが、ロケールの切り替えは動的に行うことを前提としているため、サポートしている全ロケールのコードがリンクされてしまうことになります。

これでは、ごくごく単純なHello, World!を出力するだけのプログラムであっても、サイズが非常に大きくなってしまいます。実際のところ、ロケールの機能を使いこなせる技術者はそう多くありませんし、使いこなせたとしても、本当に使いこなす機会はそう多くはありません。そう考えると、この機能はかなり冗長なものです。

ロケール周りを適切にカスタマイズしたストリームクラスを再実装するか、独自のストリームクラス群を定義することで、サイズの問題は大幅に改善する可能性があります。

Comment

Post a Comment









管理者にだけ表示を許可

Trackback

http://cppemb.blog17.fc2.com/tb.php/119-80af5de2

C++と組み込み環境 | Page Top▲

New >>
クラスのメンバをROMとRAMに分離する
<< old
組込みプレスSelection #1
ブログ内検索
RSSフィード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。