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