Я заметил странное поведение в множественном наследовании. Давайте посмотрим на следующем примере:C++: Неожиданный размер объекта класса в множественном наследовании
#include <iostream>
using namespace std;
struct A {};
struct B : public A { double x; };
struct C : public A, public B {};
int main() {
cout << "Size of double: " << sizeof(double) << endl;
cout << sizeof(A) << ", " << sizeof(B) << ", " << sizeof(C) << endl; // gives 1, 8, 16
}
размер типа равен 1 (странно, но приемлемо), размер типа B равно 8 (такой же, как двойного типа, который, как ожидается), но размер C type ... равно 16. Что еще более странно, когда я пытался найти неожиданную переменную, я не мог ее идентифицировать.
struct D { double a, b; };
C c;
auto &d = reinterpret_cast<D&> (c);
d.a = 1;
d.b = 2;
cout << c.x << endl; //gives 2
cout << c.B::x << endl; //gives 2
cout << c.C::x << endl; //gives... 2
cout << d.a << ", " << d.b << endl; //gives 1, 2
Я получил этот путь совершенно неожиданное поле данных в объекте, и я не могу получить доступ к нему обычным способом. Есть ли способ объяснить это? Ожидается ли поведение от компилятора C++?
Кстати, код был написан и составлен в Visual Studio 2015, 64x, но когда я составил первую часть на г ++ (Ubuntu), результат был тот же - 1, 8, 16.
Ах, указать моя проблема - я хотел бы хранить большое количество данных, указанных как унаследованный тип, поэтому меня беспокоят бесполезные зарезервированные байты. Если у кого есть решение, я буду рад услышать - даже если это #define
или вариант компиляции.
'align_up (1, 8) + 8 = 16' –