C ++中类对象的大小

时间:2016-11-02 04:51:47

标签: c++ sizeof

以什么为基础的类对象的大小显示为12?

tr -d "\0" < ElapsedTime.txt | tail -c+3 | ...

输出:

<style>
    body { width: 400px; }

    p { margin-top: 0; margin-bottom: 0.5em; }

    blockquote {
        background-color: antiquewhite;
        padding-top: 0.5em; padding-bottom: 0.5em;
        margin-top: 0; margin-bottom: 0.5em;
    }

    /* Two workarounds */
    /*
    blockquote { padding-bottom: 1px; }
    blockquote { padding-bottom: 0; border-bottom: 1px solid antiquewhite; }
    */

    /* Will not work, due to padding/margin collapsing, as I understand */
    blockquote { padding-bottom: 0; }
</style>

<p>Some text before blockquotes</p>

<blockquote>
<p><strong>1st blockquote</strong></p>
<p>1st paragraph. Foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo.</p>
<p>2nd paragraph. Bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar.</p>
</blockquote>

<blockquote>
<p><strong>2nd blockquote</strong></p>
<p>1st paragraph. Foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo.</p>
<p>2nd paragraph. Bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar.</p>
</blockquote>

<p>Some text after blockquotes</p>

1 个答案:

答案 0 :(得分:7)

这样想。让我们想象标准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++;
     }

    ...
};

让我们在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()运算符只考虑成员变量,而不是与每个变量相关的任何堆分配。

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

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