2012-10-03 4 views
13

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

私が基本クラスをたくさん持っている場合、コンパイラがこの最適化を行うのに役立つ方法はありますか?

#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 
+1

デバッグモードでコンパイルしていますか? – jpm

+0

@jpm:いいえ、リリースモードです。 – Mehrdad

+0

メモリレイアウトに影響する最適化は、すべてのコンパイル単位で一貫して実行する必要があります。したがって、コンパイラが構造体/クラスのメンバーを再注文できない理由と同様に、これは必須であるか、まったく同じでなければなりません。 – Mysticial

答えて

18

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

この問題は、2006年にMicrosoft Connectで報告されました。Empty Base Optimization Not Working Properly.現時点では、Microsoft Connectでは古いバグは表示されません。私はこれが一時的な問題だと言われていますが、いつ解決されるのか分かりません。その間に、次は、Visual C++コンパイラチームの開発者の一人であるジョナサン洞窟からのバグへの応答です:

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

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

+0

Iあなたが本当に*必要とするときにMSDNリンクがどのように壊れているか興味深いと思っています。少なくとも彼らはそれを修正する予定です... – Necrolis

+0

これはVS2017の問題です。しかし、この[ブログの投稿](https://blogs.msdn.microsoft.com/vcblog/2016/03/30/optimizing-the-layout-ofempte-base-home.php)に従って、いくつかの手動作業で回避することができます。 classes-in-vs2015-update-2-3 /)を参照してください。 VS2015 Update 2以降、派生クラス宣言に '__declspec(empty_base)'を追加して、複数の継承シナリオでEBOの適用を強制することができます。これは、バイナリ互換性を維持するために手動で行う必要があります。 – w1th0utnam3

8

「公式」のスタンスは非常にそれが残っているすべては、それを指摘しているquestion on MSDN古いと言及され、残念ながらこれが記載されているバグレポートは、MSによって削除された、MSVCのみ単一継承のためEBOを行いますです今バグレポートを削除しました。