我有这个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 *)*?
答案 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个字节)实现 - 一个指向分配的数组的开头,一个指向数据的末尾,一个指向数据的末尾。分配数组。