有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
Is there a way to define array size based on command line argument? Run time vs compile time instantiation?
我有一个大小为DIMENSIONS
的全局数组:DIMENSIONS
是一个静态全局变量。我可以更改硬编码的DIMENSIONS
变量而不会在编译或执行中出现问题,但是有没有办法在编译时与运行时确定此值?
const static unsigned int DIMENSIONS = 2;
std::array<double, DIMENSIONS> arr;
// ...
// ...
// ...
int main (int argc, char* argv[]) {
// argv[1] contains value '4'
}
如果我DIMENSIONS
非常量非静态,有没有办法将其重新初始化为main()
中的argv[1]
并且arr
仍然正确实例化?我想完成什么的想法:
unsigned int DIMENSIONS;
std::array<double, DIMENSIONS> arr;
// ...
// ...
// ...
int main (int argc, char* argv[]) {
DIMENSIONS = atoi(argv[1]);
}
我想通过命令行控制程序的维度(用于爬山优化(。我知道数组不能具有动态大小调整,除了 VLA 之外,必须在编译时而不是运行时声明其大小。不过,我特别需要一个全局非VLA。
不,这通常是不可能的。
首先,您需要在编译时知道模板的所有实例化。如果您不打算为可以使用的每个DIMENSIONS
值实例化std::array<double, DIMENSIONS>
,那么这已经取消了任何解决方案的资格。
即使你已经实例化了DIMENSIONS
的每个可能值,也不能让全局静态std::array
对象改变其大小。
原则上,您可以将不同std::array
类型的对象放置到arr
占用的存储中,但这需要以DIMENSIONS
允许的最大值的大小声明它,并且还需要携带数组的大小,以便在任何地方使用正确的类型访问它,并使访问它的每个代码都以此为条件。
C++17 提供了封装这一点的std::variant
,但只有 C++11 它看起来并不好(至少没有 boost 的一些帮助(,所以我跳过了它。
但最终它会太复杂,并且会生成非常大的二进制文件。您应该简单地使用std::vector
而不是std::array
.
如果你想允许任意值DIMENSIONS
,那么这是不可能的。
这是一个非常有趣的问题。然而,答案是否定的。
C 数组和std::array
的大小在编译时已知/构造。argv
和argc
直到运行时才知道。真的没有例外,无论如何尝试使用仅在运行时知道的大小可能会产生一些非常糟糕的结果。
如果您想要一个大小长度可变的数组C++,这些是您的选择。
我不确定我是否理解你所说的"我特别需要一个全局非VLA"是什么意思,但是如果你暗示你出于某种原因需要专门std::array
,你可以将std::vector
的元素复制到std::array
中,但请注意,你仍然坚持在编译时知道这些std::array
的大小。
另请注意,在大多数情况下,std::vector
的工作方式与std::array
一样好,除非 API 函数专门接受std::array
或类似奇怪的东西。
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 在运行时解析函数,而不是在编译C++解析函数
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 在编译时为运行时设置环境变量
- 运行时检查失败 #0 用于运行时重新编译
- std::tuple 可以根据其值在编译时/运行时排序吗?
- C++项目编译强制使用 /clr 选项,尽管在没有公共语言运行时支持的情况下执行它
- 在编译时而不是运行时创建一个由两个字节组成的值
- scanf() 的宽度说明符 - 要使用的字符长度在编译时不固定,仅在运行时确定.如何使其可变?
- 如何在运行时编译 c++ 代码(如 Python 中的 eval)
- C 构造函数运行时/编译时间
- 有没有办法在运行时编译C++代码
- visual在源代码中是否有预定义的#define或其他方式来了解它是为C++/CX Windows运行时编译的
- 关于运行时/编译时和堆/堆栈的说明
- 如何在运行时编译C++程序并将其链接到DLL中
- 将编译器添加到程序中进行运行时编译的好方法是什么?
- 我们可以使用“LoadLibrary”让我们的应用程序用Visual Studio 2010和静态运行时编译吗?
- 运行时/编译时初始化char***
- 在混合运行时/编译时条件下调度标记