boost.python字符串管理器

2024-06-08 09:29:54 发布

您现在位置:Python中文网/ 问答频道 /正文

怎么会呢boost.python处理std::string成员变量? 具体地说,如果我有一个类boost.python包装纸

class A {
public: 
    std::string name;
};
class_<A>("AWrapper")
.def_readwrite("name", &A::name);

std::string object与它(string)表示的PyObject之间的对应关系是如何处理的: 是否创建了boost::python::object(即PyObject)来存储指向字符串的指针,因此该对象作为代理服务器? 所以,每次我想检索字符串成员的值时,都会创建PyString对象? 内部机制可以应用于这种字符串对象吗?在


Tags: 对象字符串namestringobjectdef成员public
1条回答
网友
1楼 · 发布于 2024-06-08 09:29:54

简而言之:您对行为的怀疑和洞察力基本上是正确的,boostpython将解释您的配置以生成一个简单而低效的行为,但是它提供了支持机制来覆盖和扩展这种行为。这可能需要很多工作。在

长话短说:

is boost::python::object(i.e. PyObject) created which stores pointer to the string, thus this object servers as a proxy?

没有

Python字符串是不可变的,默认情况下(根据您的配置),boostpython会将std::string转换为新的Python字符串(str)。所以没有代理。在

Thus, each time I want to retrieve string member's value, PyString object is created?

是的。下面的断言将失败,我试图验证对字符串的python引用是否具有相同的python对象id

input = 'some value'
sut = AWrapper()
sut.name = input
assert id(sut.name) == id(input)

Can interning mechanism be applied to such string objects?

例如,如果可以为给定的c++字符串启用创建的python字符串对象的缓存,那么在可用时返回先前创建的python字符串对象?答案也是肯定的,这是可能的。boost python的概念是call policies或{a2}。(两者都不是boost python教程的一部分。)

您可以使用适当的调用策略扩展每个def_readwrite调用,或者重写std::string到{}的通用内置转换器,以引入这个理论缓存。在

请记住,python字符串是不可变的,std::string是可变的。因此,当成员从C++侧改变时,您将面临问题。此外,当代码处理每一个get和set操作时,这样的钩子也会降低运行时的性能。在

相关问题 更多 >