CodeZine(コードジン)

特集ページ一覧

C++による開発で陥りやすい問題点の検証

言語仕様の基礎を修得することの重要性

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/01/16 19:45

目次

C++の参照に関する罠

 開発現場で特に支障がなければ、必ずしも正確な基礎知識は必要でないかもしれません。しかし実際に、基礎知識の欠落が引き起こしたプログラムの不具合は少なくありません。以下のようなC++の関数がその典型例でしょう。

void example1(String str)
{
  //strを参照し、何らかの処理を実行
}

 この場合、引数strは呼出し元からコピーされ、新しいオブジェクトとして生成されます。関数内でstrを参照するだけであれば、引数を参照型に変更することでstrの生成によるオーバヘッドが解消されます。

void example2(const String &str)
{
  //strを参照し、何らかの処理を実行
}

 これは、C++の基礎的な知識不足が主な理由と考えられますが、このようなコードを書いてしまうのは何もプログラミング初心者だけではありません。豊富な経験を持つC言語のプログラマでさえ、同様の傾向が見られるのです。C言語のプログラマであれば、ほとんどの場合、以下のような関数に違和感を感じるのではないでしょうか。

struct smp1 {
  ///いくつかの要素
};

void example3(struct smp1 parm)
{
  /* parmを参照し、何らかの処理を実行 */
}

 関数example3を呼び出すと、引数の構造体が全てコピーされるので、オーバーヘッドが発生するとともにスタックを浪費します。これを見れば、ほとんどのC言語プログラマは、以下のように修正したくなるのではないでしょうか。

void example4(const struct smp1 *parm)
{
  /* *parmを参照し、何らかの処理を実行 */
}

 私の絡んだプロジェクトにおいても、何度か同じケースに出喰わしたことがありますが、C言語ではexample3のような関数を作成しないプログラマでも、C++でクラスを使う場合にはexample1のような関数を作成してしまうのです。動作そのものに問題ありませんが、非常に多く実行される場合などは、動作速度に著しく影響を与えることがあります。仮に、引数にクラスの値を受けとった場合の動きが完全に説明できなかったとしても、C++のクラスがCの構造体を拡張したものであることを知っていれば、直観的にexample1の引数が問題になることに気が付くのではないでしょうか。これは、C++の基礎知識を理解していないことによる問題の典型例と言えます。

 
 

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2006/08/07 10:25 誤字を修正(4ページ目):【誤】parmへ7を代入 → 【正】parmへ5を代入

著者プロフィール

  • 阿部 学(アベ マナブ)

    PHS実機評価、C/Sアプリケーション開発、Javaチップ開発等を経て、2002年6月にエイムネクスト(株)に入社。 現在、FA機器の通信処理改善プロジェクト、Windowsの通信ミドルウェアを組み込み機器に移植するプロジェクトに従事。

バックナンバー

連載:匠のキャリアへ
All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5