質問するログイン新規登録
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

311閲覧

dynamic_castが嫌われている理由

apa

総合スコア73

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2025/10/04 14:25

0

1

dynamic_castに関しての知識を深めたいと思い質問させていただきます。

dynamic_castはc++を使う上で好かれていないと思いますが
その理由が動的なので処理負荷がかかるということがあまり納得ができていないです。
現在のポインタ位置を移動する(相対位置を見て加減する)だけのことであるのになぜ負荷がかかるといわれているのでしょうか?(処理は挟まるけど考えるようなものではないという認識...)

ポリモーフィズムに関しても同様で呼び出しに多少のオーバーヘッドがあるとありますが、
Vtableの参照を挟んでから関数を呼び出すということですので参照にそれほど負荷がかかるとは思えず
継承を多用しすぎない設計を推奨されているのが分かりません。

これらはあくまで昔の話で現在のPCスペックが上がった現在では考える必要はほとんどないのでしょうか

参考にしたサイト
https://qiita.com/msmania/items/77ccf8194384bdb3568f
https://ittrip.xyz/c-plus-plus/cpp-vtable
https://qiita.com/4_mio_11/items/aa71f18b24ab55e4cb3d

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

「プログラムに意図が表れているか」ということが最も重要です。 そのプログラムに動的多態性が必要ですか? 不必要なのに使っているならそれは意図と異なるプログラムを書いているということであり、設計ミスということです。 もちろん必要性があって使う分には何の問題もないです。

実行速度的な部分ではそれ自体の実行コストは小さくても最適化を邪魔するという性質があるので最終的な実行速度に大きく影響することはあります。 それを込みで考えても充分に速いと考えるのであればそれでも良いですが、不必要な場所であえて不利なことをする理由もないでしょう。

動的な性質は不整合がコンパイル時には検出されないことがあります。 型システムはプログラムの構造の表れであり、型の間違いはプログラムの間違いです。 実行時になるまで問題が表面化しないよりは静的型検査で問題が検出されて欲しいです。


そして動的多態のためだけなら dynamic_cast は不要です。 派生型のポインタから基底型のポインタへの変換は失敗の可能性がないので dynamic_cast ではなく static_cast を使うべきですし、多くの場合には暗黙の変換で充分です。

dynamic_cast が必要になるのはいわゆるダウンキャスト/クロスキャストなので、これは異なる型を共通のインターフェイスで扱えないとき、つまり動的型を扱いながら多態として扱えないときです。 振る舞いの違いをクラスの中に押し込めることが出来ずに使う側で検査して分岐するなどの作業が必要になるので分岐条件のミスなどが入り込みやすく、拡張性にも欠けます。

C++ の設計者である Stroustrup 氏もその著書の中で動的な型を識別する仕組みを入れたくなかったと述べており、 dynamic_cast が表れるようなコードはアンチパターンの前兆です。 しかし動的な型を識別する仕組みを言語として用意しておかなければ、それが必要になったときプログラマは自前で型識別機構を作ってもっとひどいコードを生み出してしまうでしょう。

dynamic_cast が好まれないのは性能がどうこうではなく、それを使わなければならない状況が設計の失敗の可能性があるからなのです。 もちろん本当に必要な状況というのもあるのですが、日常的にたくさんあるようなものではないです。

投稿2025/10/04 20:13

編集2025/10/05 07:34
SaitoAtsushi

総合スコア5766

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問