Performance optimisation for parameters passed by value that are C++11 movable.

The C++ wrappers create a temporary variable for a parameter to be passed to a
function. This is initially default constructed and then copy assigned from the
instance being passed in from the target language. This is unchanged, however,
when the temporary variable is passed to wrapped function, it is now done using
std::move. If the type is move constructible, the move constructor will be used
instead of the copy constructor.

Note that the implementation calls std::move for all user-defined types
(non-primitive types passed by value), this excludes anything passed by pointer,
reference and arrays. It does also include any type that has not been
defined/parsed by SWIG, that is, unknown types. std::move is called via the
SWIG_STD_MOVE macro which only calls std::move for C++11 and later code.
This commit is contained in:
William S Fulton 2022-07-08 08:34:45 +01:00
commit e777b054d5
5 changed files with 23 additions and 10 deletions

View file

@ -7,8 +7,17 @@ the issue number to the end of the URL: https://github.com/swig/swig/issues/
Version 4.1.0 (in progress)
===========================
2022-07-08: wsfulton
Performance optimisation for parameters passed by value that are C++11 movable.
The C++ wrappers create a temporary variable for a parameter to be passed to a
function. This is initially default constructed and then copy assigned from the
instance being passed in from the target language. This is unchanged, however,
when the temporary variable is passed to wrapped function, it is now done using
std::move. If the type is move constructible, the move constructor will be used
instead of the copy constructor.
2022-07-03: wsfulton
Performane optimisation for directors for classes passed by value. The directorin
Performance optimisation for directors for classes passed by value. The directorin
typemaps in the director methods now use std::move on the input parameter when
copying the object from the stack to the heap prior to the callback into the target
language, thereby taking advantage of move semantics if available.

View file

@ -27,8 +27,8 @@ public class cpp11_move_only_runme {
using (MovableCopyable mo = new MovableCopyable(222)) {
Counter.check_counts(1, 0, 0, 0, 0, 0);
MovableCopyable.take(mo);
Counter.check_counts(2, 1, 1, 0, 0, 2);
Counter.check_counts(2, 0, 1, 1, 0, 2);
}
Counter.check_counts(2, 1, 1, 0, 0, 3);
Counter.check_counts(2, 0, 1, 1, 0, 3);
}
}

View file

@ -43,9 +43,9 @@ public class cpp11_move_only_runme {
MovableCopyable mo = new MovableCopyable(222);
Counter.check_counts(1, 0, 0, 0, 0, 0);
MovableCopyable.take(mo);
Counter.check_counts(2, 1, 1, 0, 0, 2);
Counter.check_counts(2, 0, 1, 1, 0, 2);
mo.delete();
Counter.check_counts(2, 1, 1, 0, 0, 3);
Counter.check_counts(2, 0, 1, 1, 0, 3);
}
}
}

View file

@ -22,6 +22,6 @@ Counter.reset_counts()
mo = MovableCopyable(222)
Counter.check_counts(1, 0, 0, 0, 0, 0)
MovableCopyable.take(mo)
Counter.check_counts(2, 1, 1, 0, 0, 2)
Counter.check_counts(2, 0, 1, 1, 0, 2)
del mo
Counter.check_counts(2, 1, 1, 0, 0, 3)
Counter.check_counts(2, 0, 1, 1, 0, 3)

View file

@ -427,10 +427,14 @@ String *Swig_cfunction_call(const_String_or_char_ptr name, ParmList *parms) {
String *rcaststr = SwigType_rcaststr(rpt, pname);
if (comma) {
Printv(func, ",", rcaststr, NIL);
} else {
Append(func, rcaststr);
Append(func, ",");
}
if (cparse_cplusplus && SwigType_type(rpt) == T_USER)
Printv(func, "SWIG_STD_MOVE(", rcaststr, ")", NIL);
else
Printv(func, rcaststr, NIL);
Delete(rpt);
Delete(pname);
Delete(rcaststr);