お気に入りしたユーザ

  • mattn_jp
  • jinho
  • Kazkun
  • myb
  • AmaiSaeta
  • yos316
  • DrFaust
  • broccolimustdie
  • nyamogera
  • hoshimin
  • yokato
  • x2nd
  • Hamyuts_Meseta
  • trash_box
  • kimuraya
  • krustf
  • wakarany
  • joy1192
  • fortrand
  • Clickcreate
  • PG_kura
  • kimi_juv
  • tamuratamuo
  • lunarnocturne

まとめられたつぶやき

  • 【募集】 C++で「デストラクタには、どんな場合でもvirtual付けとけ」という意見に対する反論。将来のためとはいえ、デメリットは何もないのかしら?何かのコスト増とか。
    hkato193
    2010-07-28 13:29:39
  • @hkato193 詳しくないのでわずかに知ってる知識でリプしますと、そもそも virtual をつけることで「実行時に」どの関数を呼び出すのか、検索する手間が発生するので少なくともその分は遅くなるかと。
    PG_kura
    2010-07-28 13:34:33
  • @PG_kura ありがとうございます。なるほど処理コストがそこに発生するのですね。同じソースでvirtual有る無しをビルドしてみたらサイズも増えていたので、将来のためにリソースを少し増やすという感触を得ました。ありがとうございました。
    hkato193
    2010-07-28 13:44:19
  • @hkato193 C++のデストラクタの件ですが、保険みたいなものですよね。デメリットはまったく無いわけではないですが、後々に高確率で発生しうるメモリリーク(しかも気付かない)を防ぐ為には、最初から virtualにしておいたほうが何かと安全だと思っています。
    whitedev
    2010-07-28 13:40:36
  • @whitedev ありがとうございます。自分でも簡単なコードで試したのですが、そんな印象を得ました。将来の保険、は言い得てますね。
    hkato193
    2010-07-28 13:45:11
  • デメリットというか分からないけど、struct 内の関数に後から virtual 付けてハマッたことある。ポインタ使って直にコピーしたときに先頭の vtable の分ズレてしまったという。。
    whitedev
    2010-07-28 13:47:50
  • ということで「全クラスのデストラクタに問答無用でvirtualを付けなさい」に従うことにしました。
    hkato193
    2010-07-28 13:47:25
  • @hkato193 YAGNIの原則に従うと、継承しないclassにvirtual付けるな、じゃないでしょうか :-) あと継承しないでtemplate使ったり
    splhack
    2010-07-28 13:53:47
  • @splhack @Seasons 「You Aren't Gonna to Need It.」ですね。そう思ったのですが、将来他人の手にソースが渡ってあんな○○やこんな○○をされたときのリスクと、どちらが重いかなと思った次第です。継承したらコンパイルエラーって可能かしら?
    hkato193
    2010-07-28 14:07:02
  • @hkato193 boostが使える環境なら利用しない理由はありませんねー。
    Seasons
    2010-07-28 14:08:13
  • 闇の軍団に意見を求めましょうかね。RT @hkato193: 【募集】 C++で「デストラクタには、どんな場合でもvirtual付けとけ」という意見に対する反論。将来のためとはいえ、デメリットは何もないのかしら?何かのコスト増とか。
    Seasons
    2010-07-28 13:58:41
  • protected なら non-virtual RT @hkato193: 【募集】 C++で「デストラクタには、どんな場合でもvirtual付けとけ」という意見に対する反論。将来のためとはいえ、デメリットは何もないのかしら?何かのコスト増とか。
    sscrisk
    2010-07-28 14:14:51
  • 多態する予定のないクラスに付けるのは単に無駄 RT @hkato193: 【募集】 C++で「デストラクタには、どんな場合でもvirtual付けとけ」という意見に対する反論。将来のためとはいえ、デメリットは何もないのかしら?何かのコスト増とか。
    decimalbloat
    2010-07-28 14:16:02
  • @hkato193 デストラクタのvirtualが許されるのは土台レベルのベースクラスだと思ってます。派生型の終着駅となるアプリのレイヤーでは指定する意味がない。
    TeamMOSA2
    2010-07-28 14:18:53
  • @hkato193 「何!?このvirtualって!一般的じゃない機能は使っちゃダメ!」という無知によるデメリット
    g99djps
    2010-07-28 14:21:55
  • @decimalbloat @TeamMOSA2 ありがとうございます!意訳で恐縮なのですが、保険にはならず、virtualは「このクラスは派生されることを意識してますよ」な意味にも取られてしまうリスクになると理解しました。
    hkato193
    2010-07-28 14:28:23
  • @sscrisk ありがとうございます。デストラクタがprotectedなら〜、という意味でしょうか?頂いた回答がすぐに理解できていなくてすみません・・・
    hkato193
    2010-07-28 14:31:35
  • @g99djps www。今回の「いいからvirtual付けとけ」も無知だと思うんですけれどもね・・・。ありがとうございます。
    hkato193
    2010-07-28 14:32:38
  • 本当は「いつデストラクタを仮想にするべきか」みたいな、C++使う上ではよくある話とか、「Effective C++嫁」で終わる話なんかでも記事にしたほうがいいなーとは思いつつも、めんどくさいわけである。
    decimalbloat
    2010-07-28 14:41:39
  • @hkato193 あ,継承です。protected 継承するならベースクラスのデストラクタは non-virtual でよい,という意味です。
    sscrisk
    2010-07-28 14:49:26
  • 個人的メモ2。型にしろ処理にしろデータにしろオブジェクトにしろ、閉じる方向へバイアスさせることで安全性を確保する。たいがい、開く側へは限定的にバイアスできるようになっているが、仮に総体的に開く方向へ振ってやることでも安全性を確保できるようなコンセプトがあればイノベ(以下略)
    PG_kura
    2010-07-28 14:49:50
  • protected 継承っていつ使うんだっけ…
    decimalbloat
    2010-07-28 14:51:30
  • たぶん、@hkato193 さんは言語作法はもとより、その理由もまた知りたいのだと思うのだけれど、僕には知識が足りないもどかしさ。
    PG_kura
    2010-07-28 14:51:50
  • @PG_kura いいえ、いただいたコメントから先は私が調べなければいけない領域です(でないと身にならない)。ポインタを示していただいた時点で、とても勉強になっています。お気遣いありがとうございます。
    hkato193
    2010-07-28 15:02:51
  • @hkato193 したがっちゃだめえええええ
    isoparametric
    2010-07-28 14:53:44
  • @isoparametric おおお、ありがとうございます!はたしてvirtualには「継承OK」のサインもあるのですね。ちょっと楯突いてみます。
    hkato193
    2010-07-28 15:04:43
  • あ,何か猛烈に間違ってる気がする…。やばい。俺の脳がやばい。
    sscrisk
    2010-07-28 14:52:12
  • @hkato193 さっきの間違い。すみません。@hkato193 さんの当初の理解のとおり,「デストラクタを protected にして non-virtual」というのであっています。More Exceptional C++ の項目27 参照。
    sscrisk
    2010-07-28 15:01:11
  • @sscrisk なるほどです。ありがとうございます!
    hkato193
    2010-07-28 15:01:29
  • @sscrisk More Exceptional C++の第27項ですね。手に入れて読んでみます。色々とありがとうございます。
    hkato193
    2010-07-28 15:05:52
  • 継承するしないっていうと単なる言語機能の話になっちゃうけど、動的多態するしないという話をすればもうちょっとなんかあるんじゃないかとか思ったんだけどうまく言語化できない。
    decimalbloat
    2010-07-28 15:09:35
  • パフォーマンスやサイズ(ポインタ1つ分)。そういう場合はそもそもvirtualメソッドを一つも使わないクラスにする。ポインタ1個分でも1000個作ったら4(8)KB RT @hkato193: 【募集】 C++で「デストラクタには、どんな場合でもvirtual付けとけ」という..
    pigeon6
    2010-07-28 15:17:11
  • あと「このクラスは継承するな」の意思表示(Javaのfinalみたいなもん)。コメントと併記しないと分からないけどw ちなみに、親がvirtualデストラクタなら、実子はそう定義されていなくてもちゃんと処理されるはず RT @hkato193: 【募集】 C++で「デストラ...
    pigeon6
    2010-07-28 15:19:32
  • そもそもクラス継承の利用とはなんとなく場当たり的に対応するためのものではなく明確な意志の元に選択される事を前提にした手法なので、「今はよく分からんけど継承されるかも♪」というのはそもそも設計面で考慮が足りないサイン(キリッ☆)
    pigeon6
    2010-07-28 15:22:15
  • @pigeon6 ありがとうございます。コメントと併記しないと(分からない人には分からない)、というのが難しいですね。
    hkato193
    2010-07-28 15:33:56
  • C++には落とし穴がいっぱいあるのでw コード規約化出来るなら空キーワードでfinalとか定義して使ってもいいけど、凝り過ぎですよね RT @hkato193: @pigeon6 ありがとうございます。コメントと併記しないと(分からない人には分からない)、というのが難しいですね。
    pigeon6
    2010-07-28 15:35:46
  • @hkato193 Effective C++にちゃんとルールが定義されてるんですね。真面目に読んだこと無いんですがw
    TeamMOSA2
    2010-07-28 15:31:03
  • 市販されてるアプリの大半なんてレンガを積んだものだらけだしな。
    TeamMOSA2
    2010-07-28 15:34:33
  • @TeamMOSA2 この2つの説明を合わせると、「何が何でもvirtual」はNGだと分かるんですけどね・・・
    hkato193
    2010-07-28 15:34:53
  • @hkato193 ウィザードになりきれないプログラマが説明を煩わしがって「いいからつけとけ」って年伝説が産まれているのでは。
    TeamMOSA2
    2010-07-28 15:36:46
  • 派生する予定が無いならvirtualはオーバーヘッドだしな。大体にしてC++なんて3回派生ささせたらリンカが根を上げるだろう。そんなプロジェクトのビルドは遅くてかなわん。
    TeamMOSA2
    2010-07-28 15:37:49
  • Effective C++の14項「基底クラスには仮想デストラクタを持たせよう」、37項「継承した非仮想関数を再定義してはならない」
    hkato193
    2010-07-28 15:16:18
  • More Exceptional C++のNo.27(多分) → http://www.gotw.ca/gotw/031.htm
    hkato193
    2010-07-28 15:24:38
  • 質問に答えていただいた方の、回答以降のTLを見て追加情報を得るメソッド。
    hkato193
    2010-07-28 14:37:59
  • 楯突きました。結果はどうなることやら。
    hkato193
    2010-07-28 16:02:37
  • @hkato193 ちょっとだけ補足しました。よろしければ。http://d.hatena.ne.jp/nonomachon2nd/20100729
    nonomachon
    2010-07-29 04:14:56
  • @nonomachon ありがとうございます!テスタビリティについての意見は自分には無かったので、とても興味深かったです。ぜひtogetterに追加させてください!
    hkato193
    2010-07-29 09:58:21

コメント

  • hkato193
    順番を並び替えて、TLが辿りやすくなるようにしました。
    hkato193
    2010-07-28 16:03:57
  • joy1192
    継承する予定のないクラスにはvirtualつけない! ちぃ覚えた! ……でも、普段は意識しないけど自然とそういうことしてる気がする
    joy1192
    2010-07-28 20:46:41
  • inazakira
    Effective C++を買ったはずだけどどこに積んだか思い出せない。Effectiveじゃない俺。
    inazakira
    2010-07-29 06:21:55
  • hkato193
    sscriskさんの呟きに対しての@nonomachonさんのブログを載せました。テスタビリティの観点から付けるべき、という素敵な意見も載ってるので必読です。
    hkato193
    2010-07-29 10:05:51
  • hkato193
    「色々な視点があって、その場その場で何が最適かは違うものの、まずは設計時点で『どうあるべきか』を考えること」
    hkato193
    2010-07-29 11:31:40
  • hkato193
    本件の指示に対する反論としてまとめると、途中からの指示であれば「設計の方針・思想が変化しますが、それでも良いですか?」が妥当かなあ。強引ですが。
    hkato193
    2010-07-29 13:57:23

編集の履歴

2010-07-29 10:05:51 hkato193 さんが更新しました。
2010-07-28 16:06:57 hkato193 さんがデコレーションしました。
2010-07-28 16:03:57 hkato193 さんが更新しました。
2010-07-28 15:58:18 hkato193 さんがデコレーションしました。
2010-07-28 15:53:23 hkato193 さんが更新しました。

ブログパーツ


幅・高さの指定を変えることでサイズを変更できます。
またsrcの中の「bc=***」で背景色を変更できます。