我已经实现了一种算法,该算法有一个强大的用例,可以尽快知道整个库执行期间将要计算的最大问题大小,以便可以有效地预先准备所需的内存(矩阵,向量等) -已分配。 “尽快”定义为比C ++静态初始化触发时更早或更晚。

  /**
   * Example of what I would like to accomplish but of course this
   * System#getProperty is the Java way
   */
  class texample {
      static const int MAX_M_N;
  }

  const int texample::MAX_M_N = System.getProperty("maxMN");  // possible? how?


我当然可以使用动态初始化和分配来执行此操作,但是如果在静态初始化期间“看到”了这些输入参数属性,它将更加简单。原因是静态初始化过程也会破坏静态初始化/分配的包装对象实例,而我不必担心它,例如处理异常并手动释放/删除实例。

更新:还有一件事:)我想拥有它而不必重新编译。我当然可以使用宏(我正在使用CMake),因此在CMakeList.txt文件中更改宏并重新编译将非常容易,但是我希望在运行时动态指定大小。

最佳答案

如果从环境中读取是可以接受的,则可以尝试以下操作:

#include <cstdlib>

int readme(char const * envname)
{
    char * e, * env = std::getenv(envname);

    if (!env)
    {
        std::cerr << "Environment '" << envname << "' missing, aborting.\n";
        std::exit(0);
    }

    int res = std::strtol(env, &e, 0);

    if (*e != 0)
    {
        std::cerr << "Environment '" << envname << "' unparsable (contains '" << env << '"), aborting.\n";
        std::exit(0);
    }

    return res;
}

int const texample::MAX_M_N = readme("maxMN");  // #1


请注意,“#1”行是在程序的动态初始化阶段执行的,这是第一次执行用户代码,它在调用main之前完成。

10-08 15:51