我想声明一个非常大的数组。我发现数组的最大大小是size_t,它被定义为UINT_MAX
所以我写了这样的代码
int arr[UINT_MAX];
当我编译这个时,它说数组维度溢出
但是当我这样写的时候
size_t s = UINT_MAX;
int arr[s];
它可以正确编译。
有什么不同
第一个错误:size_t
不一定unsigned int
,因此它的最大值可以不同于unsigned int
(UINT_MAX
);此外,在 C++ 中获取有关您应该使用的类型的限制的信息std::numeric_limits
.
#include <limits>
size_t s=std::numeric_limits<size_t>::max();
第二个错误:你永远不会得到这么大的数组;自从size_t
需要能够表达任何对象的最大大小,它可能应该足够大以表达与应用程序可用的整个地址空间一样大的对象,但是尝试分配这么大的对象将需要专用whole地址空间给它,这是不可行的;此外,您正在请求一系列int
这么大,这意味着它将是UINT_MAX*sizeof(int)
字节大,这可能大约是整个地址空间的 4 倍 - 显然是胡说八道 - 顺便说一句sizeof(arr)
将无法表达此类对象的大小,并且通常指针甚至无法到达该数组的顶部。编译器会检测到这些错误并阻止您这样做。
此外,我推断您正在尝试在堆栈上分配该内容,该内容通常比应用程序可以使用的所有内存小得多,并且一般来说,在那里分配大数组并不是一个好主意(您应该使用堆)。
第三个错误:分配所有内存没有意义。如果你有很大的内存需求,你应该在堆上分配东西,而不是在堆栈上,并且只分配与操作系统和其他应用程序一起运行所需的内存(如果你正在工作,最后一个考虑因素不适用)在嵌入式系统上,您是唯一正在运行的应用程序)。
C++ 中的第二个片段甚至不应该工作,因为,如果该东西在堆栈上分配,那么您将变得非标准,因为它将是一个 VLA(在 C99 中可用,但被当前和下一个 C++ 标准强烈拒绝) 。然而,在这种情况下,分配该数组的代码是在运行时使用的(VLA 通常在维度上不固定),因此对编译器的检查并不明显(尽管我认为这可以很容易地被优化器,如果 VLA 语义与常规数组没有不同,则可以优化 VLA 并尝试创建常规数组 => ,这会因我所说的相同原因而失败)。
长话短说:分配所有内存(您甚至无法寻址)是没有意义的,尤其是在堆栈上。使用堆并只分配您需要的内容。如果您有特殊要求,您应该研究操作系统提供的特殊虚拟内存功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)