2015-07-03 54 views
0

我有多少数据的结构体在它:长阵列的大结构:更喜欢堆或堆栈分配?

struct myStruct 
{ 
    char name[128], desc[128]; 
    struct Prm { char p_name[32]; int p_val; } parameter[512]; 
    char Reserved[256]; 
}; 

整个结构的尺寸,如图所示在上述例子中,是18944个字节假定没有填充;我需要其中的128个,总计2424832个字节,大于2兆字节。

我需要在全局范围内声明这个数组,分配它的最好方法是什么? 我应该做myStruct myData[128];还是声明它是一个指针,然后用new[]然后delete[]初始化它,当程序退出时呢?或者也许是矢量?

将声明它为一个简单的数组与堆栈混乱?我怎样才能确定它没有问题?从列表中

+0

'保留[256];'?有一种类型缺失。注意:你不应该假设没有添加填充。某些PCS在结构中为32位数据类型使用64位对齐方式。 – Olaf

+0

是的,忘记输入。纠正。那虽然没有回答我的问题。我的例子中没有添加填充,我只是测试了它。 –

+0

是的,确实有效,我只是问这是否是堆栈的问题,因为myData的内容会大于2 Mb。 –

回答

3

更好的选择是std::vector<>

+0

这取决于具体情况。只是在不知道所有细节的情况下提出“这更好”是无稽之谈。不过,它是**选项**。 – Olaf

2

风险大阵列被破坏你的筹码。全局变量不在堆栈中,所以没关系。

+0

“......但在数据段”:嗯,只有在明确初始化的情况下(以及仅当某些编译器/选项不为零时)。否则,它们会被压缩到'.bss'中。主要区别在于'.data'使用磁盘(或其他)空间,而'.bss'在程序启动时创建, – Olaf

+0

@Olaf我*知道*有人会咬我这个:p //我不能在运行时查找包含.bss和.data的* RAM *段的“官方”名称。 – Quentin

+0

在运行时,它们通常是一个接一个地打包(通常只是从一开始,接着是堆)。 AFAIK,没有该区域的实际名称(RAM没有可读/可写RAM的段)。如果你想命名它,我只需将它称为全局变量,而不是_stack_和_heap_或任何其他区域(例如在嵌入式系统上)。对不起,有点挑剔,但这主要是关于磁盘空间。对于嵌入式MCU,例如如果您在闪存中具有初始化值,或者在启动时清除RAM,则会有很大区别。 – Olaf