Как обернуть функцию C ++, которая использует пользовательский тип ссылки в SWIG?

во-первых, я мог бы обернуть свою функцию C ++, которая использует мой собственный тип строки. Вот как я это сделал.

Это моя функция C ++.

static void my_func(t_string message) {
do_something(message.c_str());
}

И это карта типов SWIG.

%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) или же my_func(const t_string &message),

Я спрашиваю об этом потому, что я думаю, что передача строки по ссылке будет немного быстрее, чем передача по значению, поскольку я могу избежать ненужного копирования строки.

Пожалуйста, дайте мне знать, если я ошибаюсь по этому поводу.

1

Решение

Впереди одно: я не думаю, что стоит переходить по ссылке к дополнительному значению производительности, потому что в общей производительности, вероятно, будет преобладать преобразование между типами интерпретатора и типами C ++. Более того, вы можете фактически не получить никакой производительности благодаря современной семантике перемещения, ср. Дни прохождения const std :: string & как параметр окончен?

SWIG лечит ссылки как указатели и инициализирует их 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);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]