有没有办法仅通过类型来获取向量的字节大小?
Posted
技术标签:
【中文标题】有没有办法仅通过类型来获取向量的字节大小?【英文标题】:Is there a way to get the byte size of vectors through type alone? 【发布时间】:2009-10-12 18:55:20 【问题描述】:如何预测向量的大小?
#include <vector>
#include <iostream>
using namespace std;
int main()
cout << sizeof(vector<char[8]>) << endl;
cout << sizeof(vector<char[16]>) << endl;
return 0;
[starlon@localhost LCDControl]$ ./test
12
12
【问题讨论】:
预测大小是什么意思?在您的示例中,它看起来非常可预测 - 12 个字节。不过请记住,这取决于实现。 【参考方案1】:由于vector<>
本身是一个自己进行动态内存管理的类,因此使用sizeof
运算符来询问它的大小并不是很有意义。我怀疑你会发现上面计算的值总是 12。
您可以使用.size()
方法询问向量包含多少个元素。此外,.capacity()
方法会告诉您它实际上为多少元素分配了内存(即使它们尚未全部使用)。
请记住,sizeof
在编译时进行评估,因此它无法知道稍后在运行时将多少元素插入到容器中。
【讨论】:
【参考方案2】:sizeof 总是返回第一级对象/类型的大小。它不会尝试测量对象在其他位置指向的内存量。 sizeof 返回的 12 个字节反映了 vector 数据成员的大小。其中一个成员是指向实际数据的指针。
【讨论】:
【参考方案3】:有一个方法叫做 size() 这会告诉您其中包含多少元素。 但是对象的大小不会反映这一点,因为它只包含一个指向实际数据的指针。
顺便说一句,您正在声明 char 数组的向量。 这真的是你想要的吗?
还有这个:
std::cout << std::vector<X>(Y) << "\n";
无论 X 或 Y 是什么,都应该(可能)总是返回相同的值。
【讨论】:
【参考方案4】:你到底想做什么,你想知道一个包含8个或16个char
s的std::vector
占用多少内存吗?
如果这是您想要的,那么您上面的代码是错误的。上面的代码显示的是std::vector
的大小,其中元素是char
s 的数组。它为您提供std::vector
对象本身的大小 - 但没有说明元素占用的内存量。该内存由vector
动态分配。
使用sizeof
运算符不可能知道这一点,因为sizeof
是编译时运算符,而元素的内存是在运行时动态分配的。
【讨论】:
嗯,是的,我知道这是错误的。这与我能想出的实际“正确方法”差不多。我希望找到“正确的方式”,因此提出了这个问题。 正确的做法是什么?你试图做的事情没有意义。也许告诉我们您正在尝试做什么让您认为您需要知道尺寸。 好吧,我有一个向量,我想将它 memset 为 0。也许我应该改用 char[8][8] 并根据需要重新分配? @Scott:你不需要memset
向量。只需将其初始化为所需的大小,memsetting 将自动完成。请参阅文档(例如,在 其他回复解释了为什么您不能像尝试那样直接使用 sizeof。但是,您可以使用 sizeof 通过以下方式获取您要查找的内容:
vector<int> my_vector;
// Push some stuff here
// ...
cout << my_vector.size() * sizeof(int) << endl;
my_vector.size() 将返回元素中的大小。然后使用 sizeof(element) 来获取数组中每个元素的大小(以字节为单位)。他们的产品就是您正在寻找的答案。
【讨论】:
以上是关于有没有办法仅通过类型来获取向量的字节大小?的主要内容,如果未能解决你的问题,请参考以下文章
sizeof运算符来获取各种数据类型在内存中所占字节数--gyy整理