c++中类对象的大小

Size of class object in C++

本文关键字:对象 c++      更新时间:2023-10-16

根据什么显示类对象的大小为12?

class testvector
{
    public : vector<int> test;
};
int main()
{
    testvector otestvector;
    cout<<"size :"<<sizeof(otestvector)<<"n";
    cout<<"size of int :"<<sizeof(int);
}
输出:

size :12
size of int :4

可以这样想。让我们假设标准c++库没有vector类。于是你决定生个孩子是个好主意。

你可能,至少,会想出这样的东西。(免责声明:c++的实际vector类远比复杂)

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++;
     }
    ...
};

让我们在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

一开始就有12个字节的成员变量。所以我的简单例子是sizeof(vector<T>) == 12。不管T是什么类型。sizeof()操作符只考虑成员变量,而不考虑与每个成员变量相关的堆分配。

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

所以至少,我的最小例子已经有12字节长了。在64位编译器上可能是24字节,因为sizeof(pointer)和sizeof(size_t)在64位编译器上通常是double。