2012-10-03 12 views
13

Dlaczego pełna optymalizacja klas podstawowych (EBO) nie jest w pełni zastosowana w programie Visual C++?Dlaczego pusta optymalizacja klasy podstawowej nie działa?

Jeśli mam wiele klas bazowych, czy jest jakiś sposób, aby pomóc kompilatorowi w dokonaniu tej optymalizacji?

#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

Czy kompilujesz w trybie debugowania? – jpm

+0

@jpm: Nie, jest w trybie zwolnienia. – Mehrdad

+0

Każda optymalizacja, która wpływa na układ pamięci, powinna być wykonana konsekwentnie we wszystkich jednostkach kompilacji. Musiałoby to być albo obowiązkowe, albo wcale - w sposób podobny do tego, dlaczego kompilator nie może ponownie uporządkować elementów struct/class. – Mysticial

Odpowiedz

18

To jest długotrwały błąd w kompilatorze Visual C++. Gdy klasa wywodzi się z wielu pustych klas podstawowych, tylko początkowa pusta klasa podstawowa zostanie zoptymalizowana przy użyciu pustej optymalizacji podstawowej (EBO).

Ten numer został zgłoszony w witrynie Microsoft Connect w 2006 roku: Empty Base Optimization Not Working Properly. W tej chwili stare błędy nie są widoczne w programie Microsoft Connect. Powiedziano mi, że jest to tymczasowy problem, chociaż nie wiem, kiedy zostanie rozwiązany. W międzyczasie, po to reakcja na Bug od Jonathana jaskiniach, który jest jednym z deweloperów na Visual C++ zespołu kompilatora:

hi: niestety, mimo że jest to błąd w Visual C++ model obiektowy w tej chwili nie możemy go naprawić, biorąc pod uwagę, że jego usunięcie potencjalnie spowodowałoby zerwanie wielu istniejących programów, ponieważ zmieniłyby się rozmiary obiektów. Mamy nadzieję, że w przyszłości będziemy w stanie rozwiązać ten problem, ale nie w przypadku następnej wersji produktu.

Dziękujemy za zgłoszenie problemu.

+0

zawsze jest to interesujące, jak łącza MSDN łamią się, gdy * naprawdę * potrzebujesz ich, przynajmniej planują je naprawić ... – Necrolis

+0

To nadal jest problem w VS2017. Można go jednak obejść poprzez ręczną pracę według tego [posta na blogu] (https://blogs.msdn.microsoft.com/vcblog/2016/03/30/optimizing-the-layout-of-empty-base- classes-in-vs2015-update-2-3 /). Od VS2015 Update 2 możliwe jest dodanie '__declspec (empty_bases)' do deklaracji klasy pochodnej, aby wymusić zastosowanie EBO w wielu scenariuszach dziedziczenia. Należy to zrobić ręcznie, aby zachować zgodność binarną. – w1th0utnam3

8

„oficjalnych” postawa jest MSVC będzie tylko zrobić EBO dla pojedynczego dziedziczenia, niestety raport o błędzie, gdzie ta jest zawarta została usunięta przez MS, więc pozostaje tylko starszy question on MSDN że wskazuje to na zewnątrz i odniesienia się teraz usunięty raport o błędzie.

Powiązane problemy