对STL容器sizeof
有什么要求吗?例如,我可以使用std::list
实现Node
,如下所示:
struct Node
{
Node* left;
Node* right;
T value;
};
并存储Node的两个指针或对象,如:
Node* m_head;
Node* m_tail;
或
Node m_head;
Node m_tail;
考虑到值类型T
可能很大,sizeof
的{{1}}可能非常大。可以接受吗?
答案 0 :(得分:2)
标准中没有要求容器的尺寸应该是多少。标准细节是什么,数据结构的行为是什么。它还详细说明了对其及其成员函数所执行操作的复杂性。这反过来可能会限制您设计它的方式以符合这些要求,但如果您能够以不同的方式弄清楚如何维护这些要求,那么标准允许这样做。
答案 1 :(得分:2)
对容器内存占用没有特别限制,但容器无法按照您的建议实施。
因为容器构造函数不知道 1 如何构造T
类型的对象,所以不能是{{1}类型的任何(嵌套)成员}}
1 具有元素类型默认构造函数或复制构造函数是某些容器操作的要求,但标准并不要求T
或{{1}所以实现不得不这样做。
答案 2 :(得分:1)
除了明确禁止sizeof
为零的C ++标准(否则指针算法会破坏),C ++标准库实现可以将容器sizeof
设置为它选择的任何东西。
进一步注意,例如,对于不同类型sizeof(std::list<T>)
和sizeof(std::list<Y>)
,T
不一定必须与Y
相同。