У меня есть структура воксельной как:станд :: 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;
Теперь, когда я инициализирую вокселы вектором, он занимает приблизительно 79 МБ в ОЗУ.
std::vector<voxel> vi(n);
Но это требует более 2 ГБ, когда я инициализирую его таким образом, используя shared_ptr и переполнение стека.
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
Update: Я также попытался с этим петлю вместо толчка назад, но результат тот же. Теперь у меня есть общий смысл, почему это происходит.
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;
}
Помните, что когда вы задаете размер вектора (используя, например, конструктор, как и вы), а затем вызываете 'push_back', вы увеличиваете размер вектора. Поэтому в вашем примере вы создаете вектор с элементами '2 * n'. Затем вам нужно запомнить накладные расходы на хранение самого указателя, а в 64-битной системе указатель равен 8 байтам по сравнению с вашей структурой из 3 байтов. –
Это переполнение стека? Ты уверен? –
дает ошибку std :: bad_alloc в ячейке памяти. Это, как правило, из-за переполнения, верно? –