为什么和如何C++允许使用动态值创建编译时数组
Why & How C++ allows compile time arrays to be created using dynamic values
在编写一些代码时,我意识到我的一个代码工作,根据我的理解,它不应该工作。代码是
int main() {
int val;
cin>>val;
int array[val];
}
不仅如此,甚至下面的代码也可以工作
int main() {
int valone = rand();
int valtwo = rand();
int array[valone][valtwo];
}
我一直明白静态数组需要常量值,或者编译器在编译时可以推导出的值。
最近的 C++11/14 规范是否有任何变化,或者自开始以来C++都是如此。
注意:在这种情况下,Visual Studio 编译器确实会给出错误,但
g++
以及clang
成功编译上述代码
它是一个可变长度数组。
这些由C99支持,GCC和Clang都支持它们作为非标准扩展C++。(它们不是C++语言的一部分。MSVC 不支持 C99,因此根本不支持它们。
在标准C++中,应改用std::vector
。
这是一个名为可变长度数组的编译器扩展。正如您所说,这不是标准C++,因此在尝试编写符合交叉编译器的代码时不应依赖它。相反,您可以将std::vector
用于"动态数组",这是标准的。
有一些编译器允许可变长度数组作为语言的扩展。如果你想要可移植的代码,不要依赖它,而是使用std::vector
。
可变长度数组在 c++ 中不是标准的。一些编译器支持它,但作为非标准扩展。
例如,请参阅此处有关此扩展的 gcc 文档。
VLA是一个非常有用的结构。它们允许人们创建编译时已知大小的数组,但使用自动内存,而不是像向量那样依赖动态内存管理。
避免动态分配可能有多种原因,其中最重要的是它造成的性能损失(特别是在多线程场景中)以及某些MCU上缺乏动态内存控制。
相关文章:
- 此代码编译良好,但文件未创建?请指出错误
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 在VS Code中编译C / C ++时如何禁用自动创建EXE文件?
- 从编译时已知的日历日期创建"std::chrono::time_point"
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- 在编译时从 c++ 文件创建枚举
- 在编译时而不是运行时创建一个由两个字节组成的值
- 我可以在不创建项目的情况下在Visual Studio 2019中编译和运行HelloWorld.cpp吗?
- 如何在C++中创建自己的编译密钥
- 从"<Base>std::unique_ptr"创建"ClassType<std::unique_ptr>"时出现编译错误<Derived>
- 使用成员函数创建std::函数不会编译
- 有没有办法在 C++17 中创建编译时类型映射以进行类型检查?
- C++ - 我可以创建编译时变量对象吗?
- 如何为多个C++类型创建编译时检查
- 为什么和如何C++允许使用动态值创建编译时数组
- 使用整数模板参数创建编译时双精度
- 如何使用模板使用fibonacci编号创建编译时的模板/数组/矢量
- 使用 SFINAE 但不创建编译错误
- 使用可变参数模板创建编译时布尔表达式
- Visual Studio 2010创建编译代码的应用程序