std :: shared_ptr比vector更多的内存空间

时间:2015-10-19 11:48:04

标签: c++ vector shared-ptr

我有一个体素结构:

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;
    }

2 个答案:

答案 0 :(得分:5)

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);

这将创建nshared_ptr s,然后push_back另一个n非空shared_ptr s,这样你就可以创建向量的大小。如果您想预先分配vector的大小,那么您应该使用

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

答案 1 :(得分:4)

嗯,voxelshared_ptr<voxel>不是一回事,所以我不太明白为什么你认为他们应该有相同的尺寸。 shared_ptr<voxel>至少代表voxel 加上指针的大小和一些引用计数信息。这些都必须存放在某个地方。

您的第二个示例也存在缺陷,因为它的元素数量是第一个示例的两倍:您使用n“空指针”元素初始化,然后push_back n更多。< / p>