带有向量的结构体的大小

use*_*803 5 c++ struct pointers

我试图找出带有对象向量的结构和带有对象指针向量的结构的大小差异。

我编写的代码表明,即使在理论上,两个结构的大小也是相同的,至少基于它们的内容,它们应该是不同的。

根据结构的内容查找结构的正确大小的正确方法是什么?

#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;
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 4

理论上至少根据它们的内容它们应该是不同的。

不,大小不应该不同:std::vector<T>将数据存储在动态分配的存储中,而struct仅存储由几个指针组成的“锚”部分。在确定此足迹的大小时,不计算向量内的项目数以及向量本身内的项目的大小。

为了计算内存中的大小,您需要编写一个函数,将每个容器内各个项目的大小相加,并添加容器本身的容量,乘以容器项目的大小。

  • @Angew 第 23 条容器(例如 `std::vector`)不允许使用小容器优化,因为它们的 `swap` 不允许使迭代器无效。`basic_string` 的 `swap` 允许使迭代器无效,从而允许 SSO。它的非常量“operator []”、“begin()”、“end()”等不是 const,从而阻止了写时复制。这实际上在 §C.2.12 [diff.cpp03.strings] 中有所说明 - 在 C++03 中情况相反,允许 COW,禁止 SSO。 (2认同)