对string对象或者vector对象执行sizeof运算

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字节。


    sizeof返回的则只是这个类“直观上”(也就是写在成员声明里的)的占用空间。一个类的成员变量可大致分为两种,固定分配成员和动态分配变量,例如这样一个类:

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同理。(未完,待续!)


  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值