有没有办法仅通过类型来获取向量的字节大小?

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&lt;&gt; 本身是一个自己进行动态内存管理的类,因此使用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个chars的std::vector占用多少内存吗?

如果这是您想要的,那么您上面的代码是错误的。上面的代码显示的是std::vector 的大小,其中元素是chars 的数组。它为您提供std::vector 对象本身的大小 - 但没有说明元素占用的内存量。该内存由vector 动态分配。

使用sizeof 运算符不可能知道这一点,因为sizeof 是编译时运算符,而元素的内存是在运行时动态分配的。

【讨论】:

嗯,是的,我知道这是错误的。这与我能想出的实际“正确方法”差不多。我希望找到“正确的方式”,因此提出了这个问题。 正确的做法是什么?你试图做的事情没有意义。也许告诉我们您正在尝试做什么让您认为您需要知道尺寸。 好吧,我有一个向量,我想将它 memset 为 0。也许我应该改用 char[8][8] 并根据需要重新分配? @Scott:你不需要memset 向量。只需将其初始化为所需的大小,memsetting 将自动完成。请参阅文档(例如,在 上)。【参考方案5】:

其他回复解释了为什么您不能像尝试那样直接使用 sizeof。但是,您可以使用 sizeof 通过以下方式获取您要查找的内容:

vector<int> my_vector;

// Push some stuff here
// ...

cout << my_vector.size() * sizeof(int) << endl;

my_vector.size() 将返回元素中的大小。然后使用 sizeof(element) 来获取数组中每个元素的大小(以字节为单位)。他们的产品就是您正在寻找的答案。

【讨论】:

以上是关于有没有办法仅通过类型来获取向量的字节大小?的主要内容,如果未能解决你的问题,请参考以下文章

sizeof运算符来获取各种数据类型在内存中所占字节数--gyy整理

获取向量的字节大小[重复]

获取 std::any 的大小

通过使用 NumPy/SciPy 检测向量的局部最大值来提取直方图模式

JAVA 反射

我想通过在 C++ 中使用向量来获取用户输入,但我得到了无限循环