繁体   English   中英

std :: shared_ptr比矢量占用更多的内存空间

[英]std::shared_ptr takes lot more memory space than vector

我的体素结构为:

struct voxel
{
    unsigned char R, G, B;
    voxel()
    {
        R = G = B = 0;
    }
    //parameteric contructor with parameters
    voxel(unsigned char pR, unsigned char pG, unsigned char pB)
    {
        R = pR; G = pG; B = pB;
    }
};

我的体素数量非常大。

int n = 300 * 300 * 300;

现在,当我使用矢量初始化体素时,它在RAM中大约需要79 MB。

std::vector< voxel > vi(n);

但是,当我使用shared_ptr以这种方式初始化它并占用堆栈溢出时,它占用的内存超过2 GB。

std::vector< std::shared_ptr<voxel> > vi(n);
for (size_t i = 0; i < n; i++)
{
    vi.push_back(std::shared_ptr<voxel>(new voxel()));
}

这种行为可能是什么原因,我该如何避免呢?

补充笔记:

std::vector< std::shared_ptr<voxel> > vi(n); //statement takes 211 MB alone

更新:我也尝试使用此循环而不是推回,但结果是相同的。 我现在对此有一个大致的了解。

for (size_t i = 0; i < n; i++)
    {
        vi[i].reset(new voxel());
        vi[i]->B = 0;
        vi[i]->R = 0;
        vi[i]->G = 0;
    }
std::vector< voxel > vi(n);

将占用sizeof(voxel) * n字节的内存。 现在,当您更改为共享指针时,您将要承担共享指针和voxel 那等同于

sizeof(voxel) * n + sizeof(std::shared_ptr<voxel>) * n

其中sizeof(std::shared_ptr<voxel>)可能是16个字节。

您在声明第二个示例时也浪费了很多空间

std::vector< std::shared_ptr<voxel> > vi(n);

这将创建n空的shared_ptr ,然后push_back另一个n非空的shared_ptr因此可以将向量的大小加倍。 如果要预分配vector的大小,则应使用

std::vector< std::shared_ptr<voxel> > vi;
vi.reserve(n);

好吧, voxelshared_ptr<voxel>是不一样的东西,所以我不太明白为什么您认为它们应该具有相同的大小。 shared_ptr<voxel>表示,至少,一个的大小voxel 加上一个指针和一些参考计数信息。 这些都必须存储在某个地方。

您的第二个示例也有缺陷,因为它的元素数量是第一个示例的两倍:您使用n “空指针”元素进行初始化,然后使用push_back n个元素进行初始化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM