[英]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
在编译时。
还要注意,除非API函数专门接受std::array
或类似的东西,否则在大多数情况下, std::vector
会和std::array
一样工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.