C ++ - 在堆上分配bitset <n>的数组

时间:2017-11-29 13:10:38

标签: c++ arrays stack-overflow bitset

我正在使用以下代码在堆栈上创建一个位集数组:

int Rows = 800000;
int Columns = 2048;

bitset<Columns> data[Rows];

如果我没有将堆栈大小提高到几百兆字节,我会收到堆栈溢出错误。

有没有办法在堆上分配这些代码?例如,使用这样的代码(我甚至不确定这段代码是否正确):

bitset<Columns>* data[Rows] = new bitset<Columns>();

编辑更重要的是,这有助于内存使用或速度吗?我是否使用堆栈或堆是否有任何区别?我真的不想使用像Boost这样的任何其他库...

我来自Java背景,一些C ++语法对我来说是新的,抱歉,如果问题似乎有点错误。

谢谢

2 个答案:

答案 0 :(得分:2)

sizeof(std::bitset<2048>) == 256

这将在堆上分配内存,它仍将占用之前的任何内存量(加上几个字节用于簿记)。然而,堆不受像堆栈这样固定大小的限制,但主要受到系统内存量的限制,所以在一台相当现代的PC上你应该可以使用几百兆字节。

我不确定这是否是您关注的问题,但是在gcc上使用bitset的内存使用效率不高 - export const Alert = (props: {message: string, type?: AlertType, createAgainButton?: Object} ) => { const type = props.type || 'Message' switch(type) { case 'Warning': return ( <div className='tgg-alert-danger'> <div className='tgg-alert-icon'><Icon name='exclamation-circle'/></div> <div className='tgg-alert-text'>{props.message}</div> </div> ) case 'Spinner': return ( <div className='tgg-alert-danger'> <div className='tgg-alert-icon'><Icon name='circle-o-notch fa-spin'/></div> <div className='tgg-alert-text'>{props.message}</div> </div>) default: return ( <div className='tgg-alert-success'> <div className='tgg-alert-icon'><Icon name='check-circle'/></div> <div className='tgg-alert-text'>{props.message}</div> { props.createAgainButton } </div>) } } 因此您不会在那里浪费一点。

答案 1 :(得分:1)

以相反的方式存储它:

int Rows = 2048;
int Columns = 800000;

bitset<Columns> data[Rows];

将为您节省将近18Mb的数据,这对于数据本地化来说更好。

在第一种方法中,如果您计算正在使用的内存量:

A = (24 * 800000) + 800000 * (2048/8) = 224x10^6 bytes

另一方面,您将行大小与要使用的内存的列大小交换:

B = (24 * 2048) + 2048 * (800000/8) = 204,849x10^6 bytes

其中,24是大多数系统中C ++中矢量对象的固定大小(以字节为单位)。 因此,在第二种情况下,您将通过使用更少的向量来减少内存使用。

A - B = 19150448 bytes = 18,26 Mb

这不是答案,但可以毫无疑问地帮助您解决问题。