C++ 更改静态数组的大小

C++ 更改静态数组的大小,c++,c,C++,C,我们在代码中声明了一个数组,如下所示。 数组将在堆栈本身上处理。 我们没有使用malloc或new在堆上分配任何内存 char a[20000]; 现在我们需要将其更改为1800000(180kb),而不是20kb。 如下图所示: char a[1800000]; 我们只是用一些数据填充数组。 这样做合法吗 我们可能面临哪些问题? 我只是担心价值似乎太大了。 有没有更好的方法来绕过这种需求 我在solaris unix平台上工作 我们只是用一些数据填充数组。这对我来说是合法的吗 是吗 对 我

我们在代码中声明了一个数组,如下所示。 数组将在堆栈本身上处理。 我们没有使用
malloc
new
在堆上分配任何内存

char a[20000];
现在我们需要将其更改为
1800000(180kb)
,而不是
20kb
。 如下图所示:

char a[1800000];
我们只是用一些数据填充数组。 这样做合法吗

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

我在solaris unix平台上工作

我们只是用一些数据填充数组。这对我来说是合法的吗 是吗

我们可能面临哪些问题

如果所有的数据访问都是基于阵列前端的,那么就不多了。如果偏移量取自末端或基于涉及尺寸的某些计算,则可能存在问题

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


有更好的方法,但并不是因为它的大小。那是个好主意。一个std::vector(例如)可以在运行时根据您当前的需要调整大小。

在一个与大小无关的普通程序上,只需拍摄图像即可,它们可以保存MB和MB的数据,有时甚至是GIG。如果你的程序在现代计算机上运行,我一点也不担心它的大小


您应该考虑将数据封装在一个将被动态分配的对象内,因为您可以在运行时使用<代码> ReLoCu(如果使用C)来增加数据的大小。如果操作正确,这也将帮助您隐藏实施细节。

对于此范围内的大小,请使用Malloc或new。通常,堆更适合于较大的分配。也更容易调整大小。如果您的分配发生在函数作用域内,这将使它位于堆栈上,则尤其如此。如果这些是全球性的,就没那么糟糕了。但是,如果可能的话,我还是坚持使用堆分配。

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

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

如果您必须创建如此大的数组,您应该使用C中的
malloc()
或C++中的
new

char *array = malloc(1800000 * sizeof(*array));
这是更便携,更安全。此外,不能调整堆栈上的数据大小。因此,使用堆

嗯,,
CK

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

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

但是,您也会说它在堆栈上,这意味着它是自动的而不是静态的。这可能是个问题,特别是在多线程程序中,因为堆栈的大小是固定的。因此,应避免在堆栈上放置大型对象;如果它们是适当的,或者动态的,则使它们静态化,否则在C中用MalOC><代码>创建它,在C++中使用<代码> STD::vector < /C> > > < /P>
在不太可能需要支持8位或16位平台的情况下,您可能会发现创建大于64kb的对象很困难或不可能。在这种情况下,您可能希望将其分成更小的部分(假设您的RAM超过64kb;否则,可以从磁带或磁盘保存和加载页面,但速度非常慢)。

要澄清一些基本概念:

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

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

堆是RAM的另一个动态部分,仅当通过malloc或
new
显式分配变量时才使用。在讨论动态内存分配(有时也称为空闲存储管理)时,通常会提到堆。除非显式初始化,否则动态分配的变量将包含垃圾值

在大多数计算机上,静态段和堆只受RAM数量的限制,而堆栈的大小是固定的、有限的。在多任务系统(如Unix)上,计算机中每个进程将有一个堆栈。我不确定Unix/Solaris允许的.bss或堆栈有多大,我怀疑这将取决于计算机的使用年限。较旧的计算机可能在堆栈上分配1.7MB时出现问题。我对Unix机器了解不多,但我怀疑不是