我们在代码中声明了如下所示的数组。
数组将在堆栈本身上处理。
我们没有使用malloc
或new
char a[20000];
现在我们需要将其更改为1800000(180kb)
而不是20kb
。
如下所示:
char a[1800000];
我们只是在数组中填充一些数据。 这是一件有效的事吗?
我们可能遇到的问题是什么? 我只担心价值似乎太大了。 有没有更好的方法来绕过这种需求?
我正在开发solaris unix平台。
答案 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)在运行时增加数据的大小。如果操作正确,这也可以帮助您隐藏实现细节。