C++中类对象的大小

Suc*_*Raj -1 c++ sizeof

在什么基础上,类对象的大小显示为12?

class testvector
{
    public : vector<int> test;
};
int main()
{
    testvector otestvector;
    cout<<"size :"<<sizeof(otestvector)<<"\n";
    cout<<"size of int :"<<sizeof(int);
}
Run Code Online (Sandbox Code Playgroud)

输出:

size :12
size of int :4
Run Code Online (Sandbox Code Playgroud)

sel*_*bie 8

想想这样.让我们假设标准C++库没有vector类.你决定拥有一个是个好主意.

你可能至少会想出这样的东西.(声明:对于C++的实际向量类是更复杂)

template <class T>
class vector
{
    T* items;        // array of items
    size_t length;   // number of items inserted
    size_t capacity; // how many items we've allocated


   public:
     void push_back(const T& item) {
         if (length >= capacity) {
             grow(length * 2); // double capacity
         } 
        items[length] = item;
        length++;
     }

    ...
};
Run Code Online (Sandbox Code Playgroud)

让我们在32位系统上分解我的简单向量类的实例:

 sizeof(items) == 4   // pointers are 4 bytes on 32-bit systems
 sizeof(length) == 4; // since size_t is typically a long, it's 32-bits as well
 sizeof(capacity) == 4; // same as above
Run Code Online (Sandbox Code Playgroud)

所以只有12个字节的成员变量才能开始.因此sizeof(vector<T>) == 12,我的简单例子.T实际上它是什么类型并不重要.sizeof()运算符只考虑成员变量,而不是与每个变量相关联的任何堆分配.

以上只是一个粗略的例子.实际的矢量类具有更复杂的结构,支持自定义分配器,以及有效迭代,插入和删除的其他优化.因此,类中可能有更多的成员变量.

所以至少,我的最小例子已经是12个字节长.可能是64位编译器上的24个字节,因为sizeof(指针)和sizeof(size_t)通常在64位上加​​倍.