【发布时间】:2013-07-04 14:34:25
【问题描述】:
我很好奇并在一些 C++ 标准库类上应用了sizeof() 运算符。这是我观察到的:
int main()
{
vector<double> v1;
set<double> s1;
map<double,double> m1;
stack<char> st;
queue<char> q;
vector<char> v2;
set<char> s2;
map<char,char> m2;
cout<<sizeof(v1)<<" "<<sizeof(s1)<<" "<<sizeof(m1)<<endl;
cout<<sizeof(v2)<<" "<<sizeof(s2)<<" "<<sizeof(m2)<<endl;
cout<<sizeof(q)<<" "<<sizeof(st)<<endl;
return 0;
}
我的系统(64 位)上的输出是:
12 24 24
12 24 24
40 40
我知道std::set 使用红黑树来实现。因此,二叉树的每个节点都有两个指针(每个 8 个字节),值(8 个字节,总共 24 个)似乎没问题。
std::map(也使用红黑树)有一个额外的密钥,但仍然是 24 字节?为什么?为什么
std::queue和std::stack占用40 个字节,而std::vector只占用12 个字节?为什么
char和double不影响类的大小?是因为模板吗?
【问题讨论】:
-
sizeof不是函数,而是 C++ 语言中定义的运算符和关键字。 -
你为什么会期待
sizeof(container)==sizeof(node)? -
为什么会这样?例如,容器可能只是指向根节点的指针的包装器。
-
@banarun:为什么?节点不存储在容器对象本身中。它们是动态存储的,并在容器对象中引用(可能通过指针)。
-
您可能拥有 64 位系统,但您使用的是 32 位编译器。