Лягнуть пустую оптимизацию базового класса (EBCO)
Кажется, что Clang не выполняет пустую оптимизацию базового класса в этом сценарии:
struct A { }; //sizeof(A) == 1 -> OK
struct B : public A { int _intValue; };//sizeof(B) == 4 -> OK, EBCO works here
struct C : public A { B _bValue; }; //sizeof(C) == 8 -> ??? Not OK
Кажется, что g++ ведет себя одинаково (или похоже). Это нормально? Я думаю, что EBCO должен пнуть здесь.
Я пропускаю что-то, что сделало бы это незаконным здесь?
2 ответа
Мне кажется, что clang выравнивается до 4 байтов, так как это может быть оптимальным доступом к памяти на вашей платформе. Как вы скомпилировали этот код?
Мне кажется, что разница заключается в том, что
&B == &(B._intValue)
против
&C != &(C._bValue._intValue)
так как &(instance of C) == &(instance of B)
должен быть недействительным, в то время как &(instance of B) == &first member of (instance of B)
допустимо в случае, когда первый член (экземпляр B) является базовым типом (char, int, ...).
Я не думаю, что это как-то связано с EBCO.