compressed_pair
использует некоторые шаблоны для экономии места. В C ++ объект (small o) не может иметь тот же адрес, что и другой объект.
Так что, даже если у вас есть
struct A { };
Размер
A
не будет равен 0, потому что тогда:
A a1;
A a2;
&a1 == &a2;
будет удерживаться, что недопустимо.
Но многие компиляторы будут делать то, что называется «оптимизацией пустого базового класса»:
struct A { };
struct B { int x; };
struct C : public A { int x; };
Здесь вполне допустимо, чтобы B
и C
имели одинаковый размер, даже если sizeof(A)
не может быть нулем.
Таким образом, boost::compressed_pair
использует преимущества этой оптимизации и, если возможно, будет наследовать от одного или другого типа в паре, если она пуста.
Так что std::pair
может выглядеть (я упустил хорошую сделку, ctors и т. Д.):
template<typename FirstType, typename SecondType>
struct pair {
FirstType first;
SecondType second;
};
Это означает, что если FirstType
или SecondType
равно A
, ваш pair<A, int>
должен быть больше sizeof(int)
.
Но если вы используете compressed_pair
, его сгенерированный код будет выглядеть примерно так:
struct compressed_pair<A,int> : private A {
int second_;
A first() { return *this; }
int second() { return second_; }
};
И compressed_pair<A,int>
будут только такими же, как sizeof (int).