gpt4 book ai didi

python - python扩展模块中的C++静态成员初始化

转载 作者:行者123 更新时间:2023-11-30 04:05:41 25 4
gpt4 key购买 nike

精简版

我不明白如何可靠地为 python 扩展初始化静态成员。特别是,如何确保来自不同编译单元的代码具有特定的加载顺序,从而满足特定的依赖关系?

长版

我有一些代码可以多次计算各种组合函数,例如阶乘、二项式等。只为这些东西构造一次表,然后对它们进行查找会更有效。我需要一个很好的接口(interface)来获取值,所以我只创建 C++ 类,并将表作为静态成员。

作为最简单的示例,要计算阶乘,我有以下内容。在 Combinatorics.hpp 中:

  class FactorialFunctor {
private:
static const std::vector<double> FactorialTable;
public:
FactorialFunctor() { };
inline double operator()(const unsigned int i) const {
return FactorialTable[i];
}
};

Combinatorics.cpp 中:

const std::vector<double> FactorialFunctor::FactorialTable = FactorialTableCalculator();

其中 FactorialTableCalculator 是一个局部函数,它只返回适当的 vector 。 [那些 operator() 对于二项式等变得更加复杂,这就是为什么我使用类来包装这些东西。]

我使用 SWIG 将 c++ 代码包装起来,并从 python 中使用它。这一切都很顺利,直到我在我正在使用的新集群​​上编译了我的代码。现在我想我以前只是运气好。

只要我在新集群上导入我的 python 模块,python 就会出现段错误。 Python 甚至没有从导入步骤中返回。使用 gdb,我追踪到了代码的另一部分,它的初始化调用了一个 Factorial 仿函数。但是 FactorialTable 还没有初始化,所以整个事情都崩溃了。

所以我需要确保在计算其他代码之前计算我的阶乘。我以所需的顺序告诉 distutils,但显然这不是他们在这个集群上被调用的顺序。链接过程中是否有一些我需要注意的阶段?

如果你真的有动力,可以浏览代码herehere ,以及给出段错误的行 here .

最佳答案

没有可靠的方法来强制执行静态成员的初始化顺序。

查看代码,但我认为您需要的不是static 成员,而是单例。 C++ 中的单例通常使用如下函数实现:

FactorialFunctorData& _FactorialFunctorData()
{
static FactorialFunctorData data_;
return data_;
}

这样您就可以强制执行时间的顺序(通过按需要的顺序调用函数)。

关于python - python扩展模块中的C++静态成员初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23178138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com