更改静态数组的大小

时间:2011-11-25 06:16:37

标签: c++ c

我们在代码中声明了如下所示的数组。 数组将在堆栈本身上处理。 我们没有使用mallocnew

在堆上分配任何内存
char a[20000];

现在我们需要将其更改为1800000(180kb)而不是20kb。 如下所示:

char a[1800000];

我们只是在数组中填充一些数据。 这是一件有效的事吗?

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

我正在开发solaris unix平台。

7 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

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

如果你必须创建这么大的数组,你应该在C中使用malloc()或在C ++中使用new

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

这样更便携,更安全。此外,您无法调整堆栈上的数据大小。所以,使用堆。

HTH,  CK

答案 2 :(得分:2)

如果你的意思是“静态”,这是一个相当现代的平台,那么这个大小的静态对象没有问题。在32位平台上,当你进入低千兆字节时,你将开始遇到困难;在64位平台上,唯一的限制是可用的存储容量。

但是,你也说这是在堆栈上,暗示它是自动的而不是静态的。这可能是一个问题,尤其是在多线程程序中,因为堆栈具有固定的大小。因此,您应该避免在堆栈上放置大对象;如果合适,则将它们设为静态,否则为动态 - 在C中使用malloc创建它,并在C ++中使用std::vector<char>

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

答案 3 :(得分:1)

对于此范围内的尺寸,请使用Malloc或new。通常,堆将更适合更大的分配。更容易调整大小。如果您的分配发生在函数范围内,这会将其置于堆栈中,则尤其如此。如果这些是全局的,那就不那么糟了。但是,如果可能的话,我仍然坚持使用堆分配。

答案 4 :(得分:1)

澄清一些基本概念:

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

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

堆是RAM的另一个动态部分,仅在通过malloc或new显式分配变量时使用。在谈论动态内存分配(有时也称为免费存储管理)时,通常会引用堆。动态分配的变量将包含垃圾值,除非明确初始化。

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

答案 5 :(得分:0)

  

我们只是在数组中填充一些数据。这是一个有效的事情   办?

  

我们可能遇到的问题是什么?

如果所有数据访问都基于数组前面,则不是很多。如果从结束处获取偏移量或基于涉及尺寸的某些计算,则可能存在问题。

  

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

有更好的方法,但不是因为它的大小。 STL containers会是一个好主意。可以在运行时调整std::vector(例如),无论您当前需要什么。

答案 6 :(得分:0)

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

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