为什么向我添加元素时矢量具有相同的大小?

时间:2016-08-16 10:23:39

标签: c++

我有这个C ++结构:

typedef unsigned long T;

struct Node {
    T index;
    T length;
    Node(): index(0), length(0), next(0) {}
    Node(const T &ind, const T &len): index(ind), length(len), next(0) {}
    vector<Node*> next;
};

我正在试图找出 next 将占用多少内存。我知道它最多会有五个元素。所以这就是我的工作:

int main(int argc, const char * argv[]) {

    Node n;
    Node* x = new Node(3, 4);

    cout << "An empty vector of pointers: " << sizeof(n.next) << " bytes\n";

    // Add five elements
    for(int i = 0; i < 5; i++)
        n.next.push_back(x);

    cout<< "New size of the vector of pointers: " << n.next.size() << " elements\n";
    cout<< "New size of the vector of pointers: " << sizeof(n.next)  << " bytes\n";

    return 0;
}

这是我的输出:

An empty vector of pointers: 24 bytes
New size of the vector of pointers: 5 elements
New size of the vector of pointers: 24 bytes

我的问题 :空向量如何可能占用24个字节,但是其中包含5个元素的相同向量仍需要24个字节?它不应该需要更多的记忆吗?像* 24 + 5 * sizeof(Node *)*?

2 个答案:

答案 0 :(得分:2)

给定类型的所有对象大小相同,sizeof(n.next)等同于sizeof(vector<Node*>)

vector实例不包含元素,它只指向它们,因此实例本身的大小始终相同。

它的工作原理如下:

class A
{
public:
    A(int n) : p(new char[n]), s(n) {}
    int size() const { return s; }
private:
    char* p;
    int s;
};

int main()
{
    A a(1);
    A b(100);
    // These all print the same thing:
    std::cout << sizeof(a);
    std::cout << sizeof(b);
    std::cout << sizeof(A);
    // These are different:
    std::cout << a.size();  // Prints 1
    std::cout << b.size();  // Prints 100
}

如果你想知道你的矢量总共有多少空间,你需要自己计算一下。

答案 1 :(得分:1)

您想要n.next.size()

sizeof完全是一个编译时操作,因为它只是查看类型以确定存储它的一个实例所需的字节数。 sizeof(n.next)告诉您保留n.next需要多少字节。由于它是vector,它可能使用3个指针(每个8个字节)实现 - 一个指向分配的数组的开头,一个指向数据的末尾,一个指向数据的末尾。分配数组。