Лягнуть пустую оптимизацию базового класса (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.

Другие вопросы по тегам