繁体   English   中英

有没有一种方法可以基于命令行参数来定义数组大小? 运行时间与编译时间实例化?

[英]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的大小在编译时已知/构造。 直到运行时才知道argvargc 确实没有例外,尝试使用仅在运行时才知道的大小可能会产生一些非常糟糕的结果。

如果要在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM