我sizeof()对一些C++标准库类很好奇并应用了运算符.这是我观察到的:
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;
}
Run Code Online (Sandbox Code Playgroud)
我的系统(64位)上的输出是:
12 24 24
12 24 24
40 40
Run Code Online (Sandbox Code Playgroud)
我知道std::set使用红黑树实现.所以二叉树的每个节点都有两个指针(每个8个字节),值(8个字节,总共24个)似乎没问题.
std::map(也使用红黑树)有一个额外的键,但仍然是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;
}
};
Run Code Online (Sandbox Code Playgroud)
如您所见,无论存储的数据集有多大,实际类的大小都是相同的(它包含相同的大小和元素数).换句话说,这sizeof(vector<int>)是不变的.存储在后面的数据的大小mdata当然是变化的,但sizeof不知道(不知道).