首先,我可以包装使用我的自定义字符串类型的C ++函数。我就是这样做的。
这是我的C ++功能。
MasiniShTable.php
这是SWIG类型图。
static void my_func(t_string message) {
do_something(message.c_str());
}
虽然这看似很好,但我想知道是否可以包裹%typemap(in) (t_string message)
{
if (!lua_isstring(L, 1)) {
SWIG_exception(SWIG_RuntimeError, "argument mismatch: string expected");
}
$1 = lua_tostring(L, 1);
}
或my_func(t_string &message)
。
我问这个的原因是因为我认为通过引用传递字符串会比传递值快一点,因为我可以避免不必要地复制字符串。
如果我错了,请告诉我。
答案 0 :(得分:1)
未来还有一件事:我认为通过引用传递额外的性能是值得的,因为整体性能可能会受到解释器类型和C ++类型之间转换的支配。此外,由于今天的移动语义,你实际上可能无法获得任何性能,参见Are the days of passing const std::string & as a parameter over?
SWIG会对references as pointers进行处理并将其初始化为nullptr
。这意味着你必须new
一个字符串,将它存储在参数中并定义一个额外的freearg
类型映射以再次摆脱分配的内存。
%module references
%{
#include <iostream>
#include <string>
using t_string = std::string;
static void my_func(const t_string &message) {
std::cout << message << '\n';
}
%}
%include "exception.i"
%typemap(in) (const t_string &message)
{
if (!lua_isstring(L, 1)) {
SWIG_exception(SWIG_RuntimeError, "argument mismatch: string expected");
}
$1 = new t_string{lua_tostring(L, 1)};
}
%typemap(freearg) (const t_string &message)
{
delete $1;
}
void my_func(const t_string &message);