题解sizeof()

#include <iostream>
#include <vector>

using namespace std;

class A {
public :
    void foo() { cout << "A foo" << endl;}

private :
    int m_i;
};

class B : public A  {
public :
    virtual void foo() { cout << "B foo" << endl; }
};

class C {
public:
     C() : _vec(4,100) {}
     void insert(int num) { _vec.push_back(num);}
private :
     vector<int> _vec;
};

int main()
{

    double a;
     char *p_ch = "abc";
     cout << sizeof(a) << endl;       //8
     cout << sizeof(p_ch) << endl;    //4
     cout << "***************" << endl;
    cout << sizeof(A) << endl;       //4
    cout << sizeof(B) << endl;       //8
    cout << sizeof(C) << endl;       //12
    A *p_a = new A();
     C c;
     c.insert(3);
     c.insert(8);
     cout << sizeof(vector<B>) << endl;   //12
     cout << sizeof(c) << endl;           //12
     cout << sizeof(p_a) << endl;         //4
     cout << sizeof(*p_a) << endl;        //4
    return 0;
}



sizefo操作符的一个主要用途是与存储分配和I/O系统那样的进程进行通信,计算出某种类型在内存中所占的单元字节。
这里的内存指的是用户存储区,不包括静态的存储区和代码区。当sizeof 计算的是指针类型时,返回值是4,所有的指针在32位系统中都是用4字节存储的。
上面的A为什么是4字节,而B是8字节呢,如下图:

因为B有虚函数,所有有包含了指向成员vptr。所有的多态类,都会有这个指针。sizeof只是计算动态分配的用户内存区,不包括程序静态区。
C为什么是12字节呢。如下图:

因为vector是12字节的。所有的存储分配器Allocator都是包含了这3个指针 。插入元素只是容器所指向的内存空间改变了,但容器本身的内存空间并没有变,所以sizeof(c)还是12字节。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值