15

Visual C++ で空の基本クラスの最適化 (EBO) が完全に適用されないのはなぜですか?

多くの基本クラスがある場合、コンパイラがこの最適化を行うのを助ける方法はありますか?

#include <iostream>

struct T1 { };
struct T2 { };
struct T3 { };
struct T4 { };
struct T5 { };
struct T6 { };

struct Test : T1, T2, T3, T4, T5, T6 { };

int main() { std::cout << sizeof(Test); }   // Prints 5
4

3 に答える 3

18

これは、Visual C++ コンパイラの長年のバグです。クラスが複数の空の基本クラスから派生する場合、最初の空の基本クラスのみが空の基本最適化 (EBO) を使用して最適化されます。

この問題は、2006 年に Microsoft Connect で報告されました: 空のベース最適化が適切に機能しません。 現時点では、古いバグは Microsoft Connect に表示されません。これは一時的な問題であると言われていますが、いつ解決されるかはわかりません。それまでの間、Visual C++ コンパイラ チームの開発者の 1 人である Jonathan Caves からのバグへの応答は次のとおりです。

こんにちは: 残念ながら、これは Visual C++ オブジェクト モデルのバグですが、修正するとオブジェクトのサイズが変化するため、多くの既存のプログラムが壊れる可能性があるため、現時点では修正できません。うまくいけば、将来的にはこの問題に対処できるかもしれませんが、製品の次のリリースには対応できません。

問題を報告していただきありがとうございます。

于 2012-10-03T18:03:56.593 に答える
8

「公式」のスタンスは、MSVC は単一継承に対してのみ EBO を行うというものです。残念ながら、これが記載されているバグ レポートは MS によって削除されたため、残っているのはそれを指摘し、現在削除されているバグ レポートを参照するMSDN の古い質問だけです。

于 2012-10-03T06:52:26.077 に答える