2011-11-25 98 views
3

我们已经在我们的代码中声明了如下所示的数组。数组要在栈本身上处理。 我们不与mallocnew更改静态数组的大小

char a[20000]; 

现在有需要我们将其更改为1800000(180kb),而不是20kb分配上堆的内存。 象下面这样:

char a[1800000]; 

我们只是填充一些数据阵列。 这是一个有效的事情吗?

我们可能会遇到什么问题? 我只是担心价值似乎太大。 有没有更好的方法来绕过这个需求?

我正在solaris unix平台上工作。

+0

你需要支持16位平台吗? –

+4

注:1800000个字节大约是1.7 MB,而不是180 KB – cbranch

+0

是的,你是right..i只是四舍五入它关闭但那不是overe这里关注:) – Vijay

回答

0

我们只是用一些数据填充数组。这是 做的有效事情吗?

是什么,我们可能面临的问题?

如果所有的数据访问都是基于阵列前面的,并不是很多。如果从最终采取偏移或基于涉及尺寸的一些计算,则可能存在问题。

我只是担心价值似乎太大。有没有更好的方法来绕过这种需求?

有更好的方法,但不是因为它的大小。 STL containers将是一个好主意。例如,可以在运行期间调整一个std::vector的大小,以满足当前需要。

+0

如果你使用的是std :: vector,那么你使用的是OP明确表示他们不想使用的动态内存,他们想要在堆栈(或静态内存段)上分配数组。 std :: vector使用堆。 – Lundin

+0

@Lundin这不是问题的第一版。我用stl回答了原来的问题作为一个建议。 –

+0

是的,在发表我的评论后,我注意到了这一点。 – Lundin

0

在大小无关的普通程序上,例如拍摄图像时,它们可以保存mbs和mbs的数据,有时甚至是演出。如果你的程序运行在现代计算机上,我完全不担心它的大小。

您应该考虑将该数据封装到将被动态分配的对象中,因为您可以使用realloc(如果使用c)增加运行时数据的大小。如果正确完成,这也将帮助您隐藏实施细节。

+1

堆栈大小和可执行文件大小 - 两者都比堆分配更有限。 – Pubby

1

在此范围内使用Malloc或新尺寸。总的来说,堆将更适合更大的分配。更容易调整大小。如果你的分配是在一个函数范围内发生的,而这个函数会把它放在堆栈上,那么情况尤其如此。如果这些是全局变量,那就不是那么糟糕。但是,如果可能的话,我会坚持使用堆分配。

+2

为什么堆可能比数据段更好? –

+0

调整大小不是必需的,因为我们相信,1.8MB足够 – Vijay

+0

@MikeSeymour问题,缺乏任何'static'关键字甚至专门指出阵列“会在堆栈本身进行处理”。所以,堆是更适合这个尺寸的部分。 – Chad

2

这个数组真的是静态的吗?因为没有static关键字。

无论如何,在栈上创建如此大的数组并不是你真正应该做的。根据编译器的不同,程序可能会崩溃,根据平台和操作系统的不同,它也可能会崩溃。

如果你需要创建这么大的数组,你应该在C++在C malloc()new做到这一点:

char *array = malloc(1800000 * sizeof(*array)); 

这是更便携,更安全。另外,您无法调整堆叠中的数据大小。所以,使用堆。

HTH, CK

+0

这就是为什么我要求输入关键字“static”。但是静态存储通常也是有限的,而堆只受RAM的限制。使用堆,卢克! :-) – ckruse

+0

OP很可能是指静态存储持续时间,在文件范围内分配的每个变量都会得到。 – Lundin

5

在变量大小的显着增加声明诸如此可影响堆栈。我建议用std::vector替换它,这将创建堆中所需的大部分内存。毕竟,这被标记为C++

+0

'static'不太可能在堆栈上实现。 –

+0

虽然这个问题意味着,它从发布的代码是不明确的情况下。如果这是在函数局部范围内声明的话,那么可能会有后果,甚至会编译。 – Chad

+0

反对转向'std :: vector'的任何争论?我认为这是一个比使用'malloc/new'的原始指针更好的替代方案,因为它的内存管理是由'vector'处理的。 – Chad

2

如果您确实是指“静态”,并且这是适合现代平台的平台,那么对于这种大小的静态对象没有问题。在32位平台上,当您达到低千兆字节时,您将开始遇到困难;在64位平台上,唯一的限制是可用的存储容量。

但是,您也会说这是在堆栈上,这意味着它是自动的而不是静态的。这可能是一个问题,尤其是在多线程程序中,因为堆栈的大小是固定的。因此,您应该避免将大件物品放在堆叠上;如果合适的话使它们成为静态的,否则就是动态的 - 用C中的malloc创建它,并在C++中使用std::vector<char>

万一您需要支持8位或16位平台,您可能会发现创建大于64kb的对象是困难的或不可能的。在这种情况下,您可能需要将其分解为更小的部分(假设您的内存超过64kb;否则,可以从磁带或软盘保存和加载页面,但速度很慢)。

1

为了澄清一些基本概念:

有关键字静态的,并且有静态存储持续时间,这意味着该变量将持续整个程序的执行,并且只会有一个实例分配的变量。具有静态存储持续时间的对象存储在RAM中的特定段中,通常称为.bss。声明为静态或文件范围(全局变量)的所有变量都具有静态存储持续时间。通过C/C++标准,保证静态存储时间的变量被初始化为零。

堆栈是RAM中的一个动态部分,其中最常分配局部变量和函数参数。在堆栈中分配的变量通常被称为自动的,例如,让编译器自动处理这个变量并将其分配到最适合的位置,这可能在堆栈上,但也可以在CPU寄存器,缓存等中进行分配。 C/C++中的关键字auto,但不需要使用它:所有局部变量和参数默认为自动。自动存储的变量将包含垃圾值,除非明确初始化。

堆是RAM的另一个动态部分,只有当您通过malloc或new显式分配变量时才会使用堆。堆是您在讨论动态内存分配时(通常也称为自由存储管理)通常所指的内容。动态分配的变量将包含垃圾值,除非明确初始化。

在大多数计算机上,静态段和堆只受RAM的数量限制,而堆栈的大小是固定的。在Unix这样的多任务系统中,计算机中的每个进程都会有一个堆栈。我不确定有多大.bss或堆栈Unix/Solaris允许,我怀疑它将取决于计算机的年龄。旧的机器可能会在堆栈上分配1.7MB的问题。我对Unix机器知之甚少,但我怀疑这个建议是在堆上动态分配所有如此大量的数据(这就是你在PC上所做的)。

+0

稍微修改一下你的说明:当你说'具有静态存储持续时间的对象存储在RAM中的一个特定的段中,通常被称为.bss'时,我会用'未初始化的'给前缀“对象”;初始化的对象通常放在另一个段中,而不是.bss。此外,当你说'具有静态存储持续时间的变量保证被初始化为零的C/C++ standards',我建议编辑,为'未初始化variables' – Dan

+0

@丹:我认为用“未初始化”你参考使用静态存储的程序员未明确初始化的变量?我不太确定这对于所有编译器来说都是如此。我想我已经看到了一些嵌入式的隐式和显式初始化变量之间没有任何区别,但将它们全部放在.bss中。 – Lundin