質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

C++

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

Q&A

4回答

4168閲覧

キャストは重いからあまり使うなと言われるが

apa

総合スコア68

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

C++

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

0グッド

0クリップ

投稿2021/07/23 07:58

編集2021/07/23 08:02

キャスト変換が重いといわれ続けて育ってきたのですが
最近本でキャストを調べるきっかけがあり
static_castを調べたところこれがコンパイル時に決まるみたいで
であればガンガン使っても問題ないのではと思って質問しました

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

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

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

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

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

Zuishin

2021/07/23 08:01 編集

誰が言い続けたんだろうそんなこと。 どういうつもりで言ったのか、そのキャストは何を意味するのか、その人に聞けばいいんじゃ? > dynamic_castのことを言っていたのでしょうか? そんなことをここで聞かれても。
apa

2021/07/23 08:02

過去の先生なので今は聞くことができません 質問は修正します
maisumakun

2021/07/23 08:04

> キャストは重いからあまり使うなと言われるが 背景とする環境などがあれば追記してください。 (組み込み向けなど、特殊な環境で使うものの場合、それに応じた実装が必要です)
Zuishin

2021/07/23 08:04

複数回、キャストが重いとしか言ってなかったんでしょうか? 重いからどうしろという代替策は聞いていませんか?
apa

2021/07/23 08:14

> 背景とする環境などがあれば追記してください。  答えになっているかわかりませんがゲーム開発で使おうとしています > 複数回、キャストが重いとしか言ってなかったんでしょうか? 重いからどうしろという代替策は聞いていませんか? Castをできるだけ使わないようにしろと言われました もしくは重い処理だとわかるように関数を命名しろと言われました
退会済みユーザー

退会済みユーザー

2021/07/23 08:18

遅くなるソースコードの例と、出力されたアセンブリコードを提示してください。
退会済みユーザー

退会済みユーザー

2021/07/23 08:30 編集

ちなみに、私は計測・検証方法も提示せず、プロファイリングも取らずに速い遅い言う奴は全く信用しません。
apa

2021/07/23 08:33

>遅くなるソースコードの例と、出力されたアセンブリコードを提示してください 存在しません ちなみに、私は計測・検証方法も提示せず、プロファイリングも取らずに速い遅い言う奴は全く信用しません。> 私が行ったわけではないのでご理解を
退会済みユーザー

退会済みユーザー

2021/07/23 08:38

なら、最低限自分で検証して、遅くなった事例が出てきてから質問してください。 https://teratail.com/help/avoid-asking > 問題・課題が含まれていない質問 > teratailは困っている人の質問を解決するサービスです。そのため、漠然とした興味から票を募るような質問や、意見の主張をすることを目的とした投稿は推奨していません。 > 何か困っている理由があり、最適解を見つける為の知見を得たい場合は、その理由や何が知りたいのかを明確に記述してください。
episteme

2021/07/23 09:46

しつもんはなんですか?
Zuishin

2021/07/23 09:57 編集

> もしくは重い処理だとわかるように関数を命名しろと言われました 他に何も要因がなく、内部でキャストを使用しているというだけで命名にまで影響を及ぼすほど重くなるというのが謎ですね。 非常に違和感をおぼえます。 極めて特殊な条件があるのであればまだわかりますが、そこに思い当たるところはないんですよね? 先生の言っていたことが間違っている可能性は全くありませんか? その先生は十分な経験と知識のある人ですか? 駆け出しのメンターとかではないですか?
apa

2021/07/23 11:34

>他に何も要因がなく、内部でキャストを使用しているというだけで命名にまで影響を及ぼすほど重くなるというのが謎ですね。 非常に違和感をおぼえます。 自分も今日調べていてそう思いました static_castを指さして重いと言っていたので 間違いはないと思うのですが、 とりあえず上司にも聞いてみようと思います!
Zuishin

2021/07/23 11:49

例えば、double の演算は float の演算よりも速いため、わざわざ float にキャストして膨大な演算を行った場合には遅くなる可能性があります。 また、double と float の相互変換自体にも時間をとられると思います。 キャスト自体ではなく、そういった「特定の型から特定の型にキャストする」という文脈でもありませんか?
guest

回答4

0

dynamic_cast は実行時キャストなので(仮想関数の呼び出しと同程度に)ほんのちょっと時間を食います。
そのことを言ってるのかも。

実際にdynamic_castした際はキャスト成否の判定がつきまとうため、余計に時間食いますけどね。

C++

1class B { ... } ; 2class D : public B { public void fD(); ... }; 3 4B* pb = ...; // B または D が入ってる 5D* pd = dynamic_cast<D*>(pd); 6if ( pd ) pd->fD(); // キャストが成功したら D::fD() を呼ぶ。

投稿2021/07/23 09:45

episteme

総合スコア16612

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

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

0

static_castはコンパイル時の型整合のためのものです。実行時に負担はありません(実行エラーが起きてもしらない)。

###キャスト変換が重いといわれ続けて育ってきた

キャストに限らず、昔の常識が常に正しいとは限らないのがこの世界です。
参考、過去の私の質問(議題)

単に、「重いからあまり使うな」では漠然としています。どの程度の重さであり、代替え手段と比較してどうなのか。ということを説明できないと意味がありません。

投稿2021/07/23 11:37

HogeAnimalLover

総合スコア4830

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

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

0

過去、キャストが重いといっていた人は

dynamic_castのことを言っていたのでしょうか?

Cスタイルのキャストをさしての話ではないでしょうか。

C++では(type)というCスタイルのキャストも、operatorオーバーロードできますので、思わぬ処理が入る可能性があります。

dynamic_caststatic_castはポインタを読み替える専用ですので、極端に重くなることは考えづらいです。

投稿2021/07/23 08:03

maisumakun

総合スコア146018

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

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

0

どういう意図で言ったのかは状況がわからないとはっきりとはわからないので以下はあくまでひとつの可能性ということを念頭において読んでください。

C++ では型変換演算子をオーバーロードできます。 そして型変換は暗黙に実行されることがあります。 これは抽象化の仕組みであって、下位レイヤの都合を上位レイヤで意識せずに済むように隠蔽できる仕組みですが、意識せずに済むということと意識しなくなるということは表裏一体です。 (明確な規則はあるとはいえど) プログラムの字面に書かれてないことが勝手に実行されるとその中に実行コストが大きい部分があっても意識せずに使ってしまうことがあるかもしれません。 C++ で何がいつ暗黙に呼ばれるのかということの詳細を把握するまで熟達するのはなかなかに困難です。

つまり、意図せず実行されることを抑止するためにコストの重い変換が必要であれば (型変換演算子のオーバーロードではなく) 通常のメンバ関数として定義し、型変換演算子 (キャスト) で変換するのを避けようということだと思います。

プログラムは明示的であるのが好ましいという方法論はあり、たとえば比較的新しいプログラミング言語 Go では暗黙の型変換がありません。

キャストが重かろうと軽かろうと必要なところではやらなければならないので必要であるかどうかを部分的に C++ のルールで判断 (そして暗黙に実行) してくれるならそのほうが良いというのが私個人としての意見ですが、どういった方法論も事情によってはある程度の利があるものなので、結局のところ場合によります。

投稿2021/07/23 15:48

SaitoAtsushi

総合スコア5684

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問