"vector of objects"大小与"vector of Object pointers"
Size of "vector of objects" Versus "vector of Object pointers"
我试图了解使用对象向量与指针向量占用了多少内存。我写了一个小的测试代码:
class Test {
public:
Test()
{ v.resize(2000); }
private:
std::vector<int> v;
};
int main()
{
std::vector<Test> OCtr;
std::vector<Test*> PCtr;
Octr.resize(10);
PCtr.resize(10, new Test);
cout << OCtr.size()*sizeof(Test) << endl;
cout << PCtr.size()*sizeof(Test*) << endl;
}
输出120和40。我能理解40——因为它是10* 4字节,但对120感到惊讶。这是集装箱的实际尺寸吗?看起来sizeof(Test)不是获得对象的完整大小的正确方法。
- 比起在Test类中提供一个成员函数来总结所有Test数据成员的内存,是否有另一个成员函数来获取任何类对象的大小?
- 我已经阅读了关于何时使用对象矢量与对象指针矢量的答案。但在一个情况下,我正在创建一个容器的简单类(无多态行为),其中内存消耗是主要标准,我可以处理对象指针的删除,我应该选择哪个容器?
如果取vector实例的大小,对于特定的系统实现,它总是相同的。在您的例子中,它是12个字节。vector使用默认的或提供的分配器为其对象内容的实际存储分配内存。默认情况下,这些内存来自堆,不会在vector对象本身的大小中注册。
您可以通过取vector类型的size并乘以元素数量,然后为vector本身添加12个字节来计算vector及其数据所使用的总内存量。
sizeof
是编译时操作符。也就是说,在编译过程中,sizeof(X)
将被替换为一个常数。这意味着sizeof
和空的vector<T>
始终与sizeof
和vector<T>
相同,其中包含数千个元素。请记住,sizeof
在运行时不做任何事情,因此结果不可能反映向量的当前状态。
120字节将是每个对象12字节,其中每个对象只是存储一个矢量,所以矢量的大小和类的大小是相同的;如果我猜的话,我猜大小是int,容量是int,还有一个指向数据的指针,加起来是12。这完全可以理解。
请记住,向量将它们的数据存储在堆中,所以它不是本地数据,因此不是sizeof
返回的vector
对象大小的一部分。只计算指向该数据的指针的大小。所以你的v.resize(2000)
不会对对象的大小做任何事情,只会对向量使用的自由存储空间的内存块大小做任何事情。
你做错了一些事情。首先,OCtr
和PCtr
都是同一类型,是Test
的向量。不像你的一些代码所建议的Test*
。
表达式PCtr.size()*sizeof(Test*)
基本上是没有意义的,因为PCtr中存储的东西不是指针,而是整个对象。然而,你是在计算指针的大小(它总是相同的)。
我知道在c++中没有相同的方法来获得对象的总大小,如果它包含动态分配(如vector)。换句话说,当您拥有对象容器时,您正在对多个.size()
by sizeof(Test)
做正确的事情,但是当您尝试创建指针容器时,您需要更加小心。
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 传递 std::vector of std::shared_ptr,而不是更新对象
- 从返回 std::optional of std::vector 的函数中获取结果到调用方
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- C++ 向量加减抛出"expression: vector subscript out of range."错误
- PyBind11:返回对 std::vector of std::unique_ptr 的常量引用
- Strange behavior of std::vector<{QString,int*}>
- 如何解决'vector subscript out of range'错误?
- 如何在 std::map 中从 std::vector of std::p air 中获取输入?
- 尝试获取矩阵的正确对角线会导致"vector out of range"错误
- 使用 boost::序列化序列化 std::vector of unique_ptr 在 Linux 上失败
- 如何使用 mpi 分散修复"vector subscript out of range"?
- 将 std::set 分配给 2D std::vector of ints
- 如何修复邻接列表中的"Debug Assertion Failed" "vector subscript out of range"
- "Vector subscript out of range",在返回声明?
- 是否有内置函数返回" the number of true value in a boolean vector "?
- pop_back() 导致"Vector subscript out of range"
- Vector of QThreads
- 如何在openACC中复制gpu vector-of-vector-pointer-memory
- STL vector of vector从double到unsigned int的转换