ich das Beispiel in C++ 14 §3.11/2 mit:Warum wurde die Größe von (D) in VS2015 um 8 Byte erhöht, als ich D von einer virtuellen Basis herleitete?
struct B { long double d; };
struct D : virtual B { char c; }
Nachdem das Snippet unten in Klirren, g ++ und VS2015 laufen
#include <iostream>
struct B { long double d; };
struct D : /*virtual*/ B { char c; };
int main()
{
std::cout << "sizeof(long double) = " << sizeof(long double) << '\n';
std::cout << "alignof(long double) = " << alignof(long double) << '\n';
std::cout << "sizeof(B) = " << sizeof(B) << '\n';
std::cout << "alignof(B) = " << alignof(B) << '\n';
std::cout << "sizeof(D) = " << sizeof(D) << '\n';
std::cout << "alignof(D) = " << alignof(D) << '\n';
}
Ich habe folgende Ergebnisse:
clang g++ VS2015
sizeof(long double) 16 16 8
alignof(long double) 16 16 8
sizeof(B) 16 16 8
alignof(B) 16 16 8
sizeof(D) 32 32 16
alignof(D) 16 16 8
Jetzt, nach der virtual
in der Definition von struct D
in dem obigen Code uncommenting und laufen Sie den Code erneut für Klirren, g ++ und VS20 15, erhielt ich folgende Ergebnisse:
clang g++ VS2015
sizeof(long double) 16 16 8
alignof(long double) 16 16 8
sizeof(B) 16 16 8
alignof(B) 16 16 8
sizeof(D) 32 32 24
alignof(D) 16 16 8
Ich habe keine Zweifel an den oben erhaltenen Ergebnissen, mit einer einzigen Ausnahme: Warum hat die sizeof(D)
16-24 in VS2015 erhöht?
Ich weiß, dass die Implementierung definiert ist, aber es könnte eine vernünftige Erklärung für diese Größenzunahme geben. Das würde ich gerne wissen, wenn es möglich wäre.
@NathanOliver diese Strukturen haben keine virtuellen Funktionen. Wird Vtable erstellt, wenn Sie virtuell abgeleitet werden? – Alex
Fragen Sie den Compiler, um Ihnen zu sagen, verwenden Sie die Kompilieroption '/ d1reportAllClassLayout'. Sie sehen 8 Bytes für den virtuellen Basistabellenzeiger + 1 Byte für D :: c + 7 Bytes Auffüllen + 8 Bytes für B :: d == 24. Der Zeiger ist im nicht-virtuellen Fall entfernt. –
Ich denke das [Blogbeitrag] (http://lolengine.net/blog/2012/10/21/the-stolen-bytes) hilft dir. In dem Kommentar gibt Jangray, der in einer Vergangenheit MSVC-Compiler geschrieben hat, eine Erklärung. – akakatak