簡體   English   中英

boost.python字符串管理

[英]boost.python string management

boost.python如何處理std :: string成員變量? 具體來說,如果我有一個類及其boost.python包裝器

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

如何處理std :: string對象和它表示的PyObject之間的對應關系:創建了boost :: python :: object(即PyObject)來存儲指向字符串的指針,因此該對象作為代理服務器? 因此,每次我想檢索字符串成員的值時,都會創建PyString對象嗎? 可以將interning機制應用於此類字符串對象嗎?

簡短的答案:您對行為的懷疑和見解基本上是正確的,boost-python會解釋您的配置以產生簡單且效率低下的行為,但是它提供了支持機制來覆蓋和擴展此行為。 這可能是很多工作。

長答案:

是boost :: python :: object(即PyObject)創建的,它存儲指向字符串的指針,因此該對象服務器作為代理?

沒有。

Python字符串是不可變的,默認情況下(使用您的配置)boost-python會將std :: string轉換為新的python字符串(str)。 因此,沒有代理正在進行。

因此,每次我想檢索字符串成員的值時,都會創建PyString對象嗎?

是。 以下斷言將失敗,在此我將嘗試驗證對字符串的python引用具有相同的python對象id。

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

可以將interning機制應用於此類字符串對象嗎?

例如,如果您可以為給定的c ++字符串啟用對創建的python字符串對象的緩存,然后在可用時返回先前創建的python字符串對象? 答案是肯定的,這是可能的。 boost-python概念是調用策略自定義轉換器 (兩者都不是boost-python教程的一部分。)

你要么延長每次def_readwrite呼叫與適當的呼叫政策,或覆蓋一般內置轉換器std::string從到/ PyString ,引進這一理論緩存。

請記住,python字符串是不可變的,而std :: string是可變的。 因此,當從C ++端更改成員時,您將遇到問題。 此外,當代碼處理每個單獨的get和set操作時,此類掛鈎也會在運行時降低性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM