看看這三個類(包括中省略):爲什麼繼承不會增加大小,但會員呢?
template<class T> struct A {
std::allocator<T> allocator;
T* ptr;
};
template<class T> struct B {
T* ptr;
std::allocator<T> allocator;
};
template<class T> struct C : std::allocator<T> {
T* ptr;
};
int main(int argc, char **argv) {
std::cout << "A: " << sizeof(A<int>) << "\n";
std::cout << "B: " << sizeof(B<int>) << "\n";
std::cout << "C: " << sizeof(C<int>) << "\n";
}
如果你問我,取決於對齊方式,無論是A
或B
必須具有相同的大小C
。然而,打印sizeof
另有聲明:
A: 16
B: 16
C: 8
這是爲什麼呢?
'std :: allocator'本身沒有成員變量,因此如果您將它用作基類,則應用EBO(空基優化)。作爲會員,不允許這樣的優化(AFAIK)。 –
@DanielFrey所以當創建一個容器時,我應該創建一個'detail'成員類,它包含所有數據成員,並從allocator模板參數繼承,以最大限度地減少容器的大小? – orlp
@nightcracker:這就是幾乎所有標準庫類實現的方式... –