Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。クラス階層の線形化」に、菱形継承は線形継承より遅いというような事が書かれています。impl::Varこれでも動作したが、大きなメモリオーバヘッドが発生していた。仮想基底を移動するためのデータのために、ノードが大きくなりすぎていたからだ。各オブジェクトがもつ数多くの仮想基底への間接アクセスが多いので、プログラム動作の速度も深刻なほど低下していた(§21.3.5)。この解決策が、二つの階層を線形化することであった。仮想基底クラス」を読んでも、もう少し具体的にどこにどういう理由で時間がかかるのか理解できませんでした。3.5.2では若干線形継承の方が速いことは確認できました。(手元のマシンではstd::chrono::high_resolution_clockでもミリ秒単位ぐらいでしか計測できませんでしたが、1000回call_function()をまわして4ミリ秒くらいの差しかありませんでした。個の銅バッジ深い階層のデータ使ってる?ように私には見えなかった。18:301上記の例だと、coutへの出力が(/dev/nullにリダイレクトしているとは言っても)重すぎるので、菱型継承のパフォーマンスへの影響が見えにくくなっているのではないでしょうか。試しにcoutへの出力をコメントアウトしてみたところ、私の環境では、菱型継承では5,000us程度なのに対し、線形継承では1,500us程度と、明確に差が出ました。後で簡単に階層数を変えられるようにテンプレートで再帰的にクラスを作って、書籍から引用したクラス階層になるように継承しているつもりです。RCを入手したのでIDEでオブジェクトを見てみましたが、少なくとも線形継承の方は期待通りの階層になっているように見えます。菱形継承の方は仮想継承のせいかイメージしていたのと異なる見え方ですが。差は3.5ミリ秒なので、削った処理分が双方共に速くなっただけで、クラス階層の違いによる差は結局3.5~4ミリ秒程ということになると思うのですが。call_function<>()を1,000回呼び出して4ミリ秒程の差を、若干と捉えるか深刻なほど大きいと捉えるかという感覚の違いもあるかもしれません。C++の設計者が、どのぐらいを深刻と捉えていたか、についてはメンバ関数のデフォルトが仮想関数でない(可能な限りvtblを作りたくない)という設計が参考になるのではないでしょうか。いう事を全く許容出来なかったようです。いっても私の書いていることは「C++の設計と進化」という本の内容の劣化コピーですので、正しいことが知りたければそちらを参照してください。inheritance)を利用すると、C++オブジェクトを表現する仮想関数テーブル(vtbl)が複雑になるため、追加の実行時オーバーヘッドを生じます。仮想継承をどのように実現するかはC++コンパイラに依存しますが、内部処理としては同程度の操作を要求するため、どのような処理系でも同じ傾向となるはずです。線形継承では単純で直線的なvtbl構成で済むため、キャスト処理はほぼゼロ・オーバーヘッドで行えます。仮想継承を用いた場合は複雑なvtbl構成となり、キャスト処理では間接参照やオフセット再計算など追加処理が必要となります。|2上手く説明できませんが...「インターフェイスの検索と実装の検索で2回検索するから?でも1回(線形継承の場合)か2回(菱形継承の場合)の差で深刻なほど速度差があるものなのか...?」の通りです。見るとわかりますが、virtual継承をしている菱形継承の場合はサイズが8バイトずつ増加していきます。(もちろん実装依存です。)線形継承の場合はサイズは変わりません。RCでは8バイトずつ増えました。線形継承の方は3つの処理系全てで4バイトと固定だったので、メモリー使用量の違いについては理解できました。ABI)とVisualC++とではメモリレイアウトが結構違いますから、オブジェクトサイズも違う結果となりますね。21ページ目以降で違いが説明されています。3:471Clang/GCCは、非静的メンバー変数を持たない場合は(-O0を指定しても)最適化されるようで8バイト固定になりますが、非静的メンバー変数を追加すると(メンバー変数分を除いて)8バイトずつ増えていきました。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。