Цепное наследование пустых классов все еще необходимо? - PullRequest
0 голосов
/ 18 января 2019

Есть ли еще веские причины для использования базовых цепочек, а не плоского множественного наследования?

Раньше было так, что некоторые классы были разработаны для наследования в цепочке. Я думаю, что это было заставить пустую оптимизацию базового класса. Я понимаю, что так были разработаны Boost.Operators.

struct empty{};

template<class Base = empty>
struct A : Base{}; 

template<class Base = empty>
struct B : Base{}; 

template<class Base = empty>
struct C : Base{};

struct S : A<B<C<>>>{};

int main(){static_assert(sizeof(S)==1, "!");}

Нужно ли это больше в новых компиляторах (сегодня 2019), или я могу отказаться от всей этой сложности и жить с нормальным наследованием?

struct A{}; 

struct B{}; 

struct C{};

struct S : A, B, C{};

int main(){static_assert( sizeof(S) == 1 , "!");}

служит ли он больше первичной или вторичной цели?

1 Ответ

0 голосов
/ 18 января 2019

Стандарт гласит: [class.derived]/7, что:

Субобъект базового класса может иметь нулевого размера.

Это означает, что EBO не является обязательным для реализации компиляторами. Однако почти все компиляторы реализуют это.

Начиная с C ++ 20, есть атрибут [[no_unique_address]], который можно применить к подобъектам пустых членов:

Пустые дочерние подобъекты могут быть оптимизированы так же, как пустые базы, если они используют атрибут [[no_unique_address]]. Взятие адреса такого члена приводит к адресу, который может быть равен адресу некоторого другого члена того же объекта.

...