我正在使用以下代码在堆栈上创建一个位集数组:
int Rows = 800000;
int Columns = 2048;
bitset<Columns> data[Rows];
如果我没有将堆栈大小提高到几百兆字节,我会收到堆栈溢出错误。
有没有办法在堆上分配这些代码?例如,使用这样的代码(我甚至不确定这段代码是否正确):
bitset<Columns>* data[Rows] = new bitset<Columns>();
编辑更重要的是,这有助于内存使用或速度吗?我是否使用堆栈或堆是否有任何区别?我真的不想使用像Boost这样的任何其他库...
我来自Java背景,一些C ++语法对我来说是新的,抱歉,如果问题似乎有点错误。
谢谢
答案 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
这不是答案,但可以毫无疑问地帮助您解决问题。