我试图通过带有对象指针向量的对象和结构向量的结构找到大小的差异。
我写的代码表明两种结构的大小在理论上是相同的,至少基于它们的内容它们应该是不同的。
根据结构的内容找到正确大小的结构的正确方法是什么?
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Song{
string Name;
string Artist;
};
struct Folder{
vector<Song*> list;
};
struct Library{
vector<Song> songs;
};
int main(int argc, const char * argv[]) {
Library library;
Folder favorites;
Folder recentPurchaces;
library.songs.push_back(Song{"Human After All", "Daft Punk"});
library.songs.push_back(Song{"All of my love", "Led Zepplin"});
favorites.list.push_back(&library.songs[0]);
favorites.list.push_back(&library.songs[2]);
cout << "Size of library: " << sizeof(library) << endl;
cout << "Size of favorites: " << sizeof(favorites) << endl;
return 0;
}
答案 0 :(得分:3)
最有可能的是,std::vector
只保留一个指向动态分配的元素数组的指针,并且该指针的大小是相同的,无论它是Song*
还是{{1} }。当然,指向内存的分配大小可能会有所不同。
换句话说,Song**
不是衡量sizeof()
所需内存量的好方法。
答案 1 :(得分:3)
理论上至少基于他们的内容他们应该是不同的。
不,尺寸不应该不同:std::vector<T>
将数据存储在动态分配的存储空间中,而struct
只存储&#34;锚点&#34;部分,由几个指针组成。向量内的项目数以及向量本身内项目的大小不会计入确定此足迹的大小。
为了计算内存中的大小,您需要编写一个函数,该函数将每个容器中各个项的大小相加,并添加容器本身的容量,乘以容器项的大小。
答案 2 :(得分:2)
为什么你会期望结构的大小不同? std::vector
通过动态分配(&#34;在堆上&#34;)存储其数据,因此没有理由将其实现包含除少数指针以外的任何内容。
确切的实现细节当然取决于标准库的实现,但典型的std::vector<T, Alloc>
可能只包含这样的内容:
template <class T, class Alloc = allocator<T>>
class vector
{
T *_Begin, *_End, *_EndOfCapacity;
Alloc _Allocator;
// No other data members
public:
/* ... */
};