我很好奇并在一些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使用Red-Black树来实现.所以二叉树的每个节点都有两个指针(每个8个字节),值(8个字节,总共24个)似乎没问题.
> std :: map(也使用Red-Black树)有一个额外的键,但仍然是24个字节?为什么?
>为什么std :: queue和std :: stack占用40个字节,而std :: vector只占用12个字节?
>为什么char和double不会影响类的大小?是因为模板吗?
解决方法
sizeof运算符将为您提供类型的大小.
现在,如果我要制作一个非常简化的std :: vector< T>版本在这里(请注意,这并不像REAL实现那样做任何事情,并且它太简单了,不能真正起作用 – 而且我正在跳过你真正需要的很多比特):
template<typename T> class vector<T> { public: typedef size_t size_type; private: T* mdata; size_type msize; size_type mreserved; public: vector() { mreserved = msize = 0; mdata = 0; } vector(size_type sz) { msize = 0; mreserved = sz; mdata = new T[sz](); } void push_back(const T& v) { if (msize + 1 > mreserved) grow(mreserved * 2); mdata[msize+1] = v; msize++; } size_type size() const { return msize; } // bunch of other public functions go here. private: void grow(size_type newsize) { if (newsize < 8) newsize = 8; T* newdata = new T[newsize]; for(size_type i = 0; i < msize; i++) newdata[i] = mdata[i]; swap(mdata,newdata); delete [] mdata; mreserved = newsize; } };
如您所见,无论存储的数据集有多大,实际类的大小都是相同的(它包含相同的大小和元素数).换句话说,sizeof(vector< int>)是常量.存储在mdata后面的数据大小当然在变化,但sizeof不知道(不知道)那个.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。