gcc 4.7.1 делает пустую оптимизацию базового класса для кортежей, что я считаю очень полезной функцией. Тем не менее, по-видимому, неожиданное ограничение на это:Общий базовый класс разрывает пустую оптимизацию базового класса для кортежей
#include <tuple>
#include <cstdint>
#include <type_traits>
class A { };
class B : public A { std::uint32_t v_; };
class C : public A { };
static_assert(sizeof(B) == 4, "A has 32 bits.");
static_assert(std::is_empty<C>::value, "B is empty.");
static_assert(sizeof(std::tuple<B, C>) == 4, "C should be 32 bits.");
В этом случае, последнее утверждение не удается, так как кортеж, на самом деле больше, чем 4 байта. Есть ли способ избежать этого, не нарушая иерархию классов? Или мне нужно реализовать свою собственную парную реализацию, которая оптимизирует для этого случая каким-то другим способом?
Возможно, [это] (http://flamingdangerzone.com/cxx11/2012/07/06/optimal-tuple-i.html) может помочь –
@ AndyProwl, интересно прочитать, но я не вижу непосредственного соединения , В нем говорится, что общие реализации кортежей используют EBCO, но не указывает на то, какой вид EBCO я вижу здесь. – MvG
Эта оптимизация не может применяться в вашем случае. В вашем кортеже есть ** два ** 'A' объекта, и каждый из них должен иметь другой адрес. Вам не нужно добавлять кортежи в код, вы можете добавить четвертый тип: 'struct D: B, C {};', и вы увидите, что 'sizeof (D)> sizeof (B)'. –