SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

匠のキャリアへ

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

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


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

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++の基礎知識を理解していないことによる問題の典型例と言えます。

 
 

次のページ
一時オブジェクトに関する知識不足

修正履歴

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
匠のキャリアへ連載記事一覧

もっと読む

この記事の著者

阿部 学(アベ マナブ)

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/276 2008/08/28 18:12

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング