C++ 通过constexpr初始化数组

C++ 通过constexpr初始化数组,c++,arrays,initialization,malloc,C++,Arrays,Initialization,Malloc,为什么从constexpr初始化数组的维度如此重要?以下代码中的常规变量是否意味着(如果法律允许)将来可能调整数组的大小 int a=5; int arr[a]; a=10; 这种特性是在年提出的,但在C++14之前就被废弃了。C和C++是完全不同的语言。它们的语法可能相似,但它们的演变有很大的差异。C++旨在使其更安全、更安全、更具危险性(如 AutoPPTR >。 P>一个C++“VLA”无论如何都不会有用,列举出一些明显排除在提案之外的特征: 多维数组,其中除顶层之外还有一个运行时

为什么从
constexpr
初始化
数组的维度如此重要?以下代码中的常规
变量
是否意味着(如果法律允许)将来可能
调整
数组的大小

int a=5;
int arr[a];
a=10;

这种特性是在年提出的,但在C++14之前就被废弃了。C和C++是完全不同的语言。它们的语法可能相似,但它们的演变有很大的差异。C++旨在使其更安全、更安全、更具危险性(如<代码> AutoPPTR <代码> >。 <> P>一个C++“VLA”无论如何都不会有用,列举出一些明显排除在提案之外的特征:

  • 多维数组,其中除顶层之外还有一个运行时绑定(类似地,array new也不支持)
  • 对函数声明器语法的修改
  • sizeof(a)是一个运行时计算的表达式,返回
  • “typedef int a[n];”计算“n”并将其传递给typedef
毫无疑问,还有更多的情况。C++的规范是C99的两倍,然后是一些错误的想象,因为“人们为什么想在任何地方都把VLAs叫到哪里”,“为什么这个怪癖的工作”或者“为什么这个怪癖不合法?”这是错误的报告。 这篇论文甚至对弗拉提出了一个共同的批评:

堆栈溢出的可能性更大,特别是当大小取决于 在外部输入时,未正确检查。有些环境可能会 因此,禁止使用该功能。这样的禁令可以被禁止 使用静态分析工具轻松实施

想象一下,如果这是一个特性,那么会有多少粗心的垃圾代码被编写出来。你可以说,在C++中,你可以用脚射击自己。但C++至少要调整你的视线,以便影响的是地面而不是你的脚。 你应该怎么做


使用
std::vector
。对一个简单的程序的性能有抱怨吗?您过早地进行了优化。

C99增加了对此的支持,称为可变长度数组(VLA)。它们不适合C++类型的系统。特别是 SeZOOS总是编译时用C++。你认为 ARR < /C>是什么类型?请注意,类型必须在编译时已知,还请注意数组的大小是其类型的一部分。数组大小是该类型的一部分。因此,每个看到
int[a]
的人都必须看到相同的类型。假设您使用T=int[a]
。如果<> > <代码>可能会发生什么变化?C++已经有了一个标准化的可移植可变长度数组,它被称为“代码> STD::vector < /代码>。
向量
和VLA之间的唯一区别在于
向量
在堆上分配其数组,而VLA在堆栈上分配其数组(在堆栈上分配可变长度数据是危险的,这就是为什么
\u alloca()
从未标准化)。VLA是特定于供应商的编译器扩展,适用于希望支持它的用户。@M.Pak No。在一般情况下,编译器无法知道非常量变量的值。所以它不会试图在这样的特定情况下找出答案。您需要一个常量(literal)、const或constexpr。