C++ Primer:对string对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
char *p;
string s1("hello");
string s2("hello world");
vector<int> vec1{ 1, 2, 3, 4 };
vector<int> vec2{ 1, 2, 3, 4, 5, 6 };
cout << "point:" << sizeof(p) << endl;
cout << "point:" << sizeof(*p) << endl;
cout << "string1:" << sizeof(s1) << endl;
cout << "string2:" << sizeof(s1) << endl;
cout << "size(string):" << s1.size() << endl;
cout << "length(string):" << s1.length() << endl;
cout << "vector1:" << sizeof(vec1) << endl;
cout << "vector2:" << sizeof(vec2) << endl;
return 0;
}
解释:
vector应该是从堆上分配内存,所以大小和元素个数无关,取决于vector类的具体实现。
STL是个完全开放的东西,谁都可以来实现vector类。
通过查看STL源码可以看到vector有四个成员变量
_A allocator;
iterator _First, _Last, _End;
每个指针是4个字节,因此16字节。
class AClass
{
int a,b,c;
int *p;
AClass()
{
p=new int [10];
}
~AClass()
{
delete[] p;
}
};
直观上,它有四个成员:a,b,c,p,不过从用途上,他也可以分为三个固定分配成员a,b,c和一组动态分配成员p[10],它生成的对象实际占有的内存空间为13个int和一个int*的空间(即56 Byte)。然而,sizeof返回的则只是这个类“直观上”(也就是写在成员声明里的)的占用空间,也就是3个int和一个int*的空间(即16 Byte)。
string类和vector类很相似,它是有一个动态分配的成员来存储字符串数据(因为字符串变长所以才要动态分配),而sizeof是检测不到这个内存长度的。vector同理。(未完,待续!)