【问题标题】:Is there a way to define array size based on command line argument? Run time vs compile time instantiation?有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
【发布时间】:2020-03-19 15:41:23
【问题描述】:

我有一个大小为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。

【问题讨论】:

  • std::vector.
  • 简短回答:不,没有。 C++ 不能以这种方式工作。这就是std::vector 的用途。
  • 您似乎已经回答了自己的问题:“我了解数组 [...] 必须在编译时声明其大小,而不是在运行时声明。”问你是否可以在运行时而不是编译时设置它们的大小?

标签: c++ arrays c++11


【解决方案1】:

不,这通常是不可能的。

首先,您需要在编译时了解模板的所有实例化。如果您不打算为每个可以使用的DIMENSIONS 值实例化std::array&lt;double, DIMENSIONS&gt;,那么这已经取消了任何解决方案的资格。

即使您已经为DIMENSIONS 的每个可能值进行了实例化,也不能让全局静态std::array 对象的大小发生变化。

原则上,您可以将不同std::array 类型的对象放置到arr 占用的存储空间中,但这需要以DIMENSIONS 允许的最大值的大小开始声明它它还需要携带数组的大小,以便在任何地方以正确的类型访问它,并使每个访问它的代码都以此为条件。

C++17 提供了 std::variant 封装了这一点,但只有 C++11 看起来不太好(至少没有来自 boost 的帮助),所以我跳过了。

但最终它会变得过于复杂,并且会生成非常大的二进制文件。你应该简单地使用std::vector 而不是std::array

如果你想允许DIMENSIONS 的任意值,那么这是不可能的。

【讨论】:

    【解决方案2】:

    这是一个非常有趣的问题。然而,答案是否定的。

    C 数组和std::arrays 的大小在编译时已知/构建。 argvargc 直到运行时才知道。确实没有例外,无论如何尝试使用仅在运行时才知道的大小可能会产生一些非常糟糕的结果。

    如果你想要一个 C++ 中长度可变的数组,these are your options

    我不确定我是否理解您所说的“不过,我特别需要一个全局非 VLA”是什么意思。但如果您暗示您出于某种原因需要 std::array,您可以使用 copy the elements of a std::vector into a std::array,但请注意,您仍然无法在编译时了解这些 std::arrays 的大小。

    另请注意,在大多数情况下,std::vectorstd::array 一样有效,除非 API 函数专门接受 std::array 或类似的奇怪东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-11
      • 2011-01-10
      • 2022-10-21
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多