我已经实现了一种算法,该算法有一个强大的用例,可以尽快知道整个库执行期间将要计算的最大问题大小,以便可以有效地预先准备所需的内存(矩阵,向量等) -已分配。 “尽快”定义为比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
之前完成。