gpt4 book ai didi

java - 接受右值引用作为参数的方法的 Swig 行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:25 26 4
gpt4 key购买 nike

Swig 文档指定它有意忽略 move 构造函数。但是它没有指定它对接受 rvlaue 引用的方法做了什么,例如:

class AAA {
public:
AAA() {}; // generates java code
AAA(const AAA& a) {}; // generates java code
AAA(AAA&& a) {}; // ignored by swig, no java code generated
virtual void move(const std::string& str); // generates java code
virtual void move(std::string&& str); // also generates java code, but accepts SWIGTYPE_p_std__string as a parameter instead of String
};

这些方法的行为会有所不同吗?有没有一种在 swig 中使用右值参数的首选方法?还是我不应该使用它们?

最佳答案

通常对于编写良好的 C++ 代码,您会期望两个重载函数或构造函数的相同行为是等效的,但需要注意的是右值引用变体很可能会破坏其输入。

因此,为了用另一种语言制作接口(interface),它可能实际上并没有任何整洁的 1:1 映射到右值试图表达的概念,那么绝大多数时候正确的答案是简单地忽略这些重载.在某些情况下,在内部,SWIG 生成的包装器可能最终会使用这些重载,或者可以通过您的一些努力来编写,但这只是一种优化。如果您要跨越 JNI 边界,那么这可能不太可能成为您最大的性能瓶颈。 (在做任何事情之前先测量它以确保)。

在某些语言(例如 Python、Lua?)中,您可能会想利用这样一个事实,即您的对象是引用计数的,这对您有利,并且(对这些语言透明地)编写一个类型映射,根据我们是否选择要使用的重载仍然是唯一持有对象引用的对象。我认为即使这种情况也是错误的(而且还过早优化),因为:

  1. 如果语言支持这样的构造,那么围绕弱引用存在竞争条件。很难发现和避免这种情况。
  2. 即使您只有一个对您的(例如)Python 对象的引用,仍然可能有多个对同一个 C++ 对象的引用,例如:

    struct a {};
    a& blah() {
    static a a;
    return a;
    }

    import test
    a=test.blah()
    b=test.blah()
    c=test.blah()

    a、b 和 c 都只有 1 个引用,但 move 它们显然是错误的。而且几乎不可能证明什么时候是安全的。

所以我的意思是:除非你别无选择,否则请忽略它们。有时您可能会遇到这样的情况,其中唯一的选择是调用一个接受右值引用的函数。您可以包装这些函数,但需要根据具体情况来完成,因为您需要了解被包装的函数/构造函数的语义。

关于java - 接受右值引用作为参数的方法的 Swig 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57149030/

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