Почему SWIG требует вспомогательных функций для работы с массивом? - PullRequest
1 голос
/ 27 июня 2011

Цитируется из здесь :

В идеале пользователь может захотеть передать массивы Perl в качестве аргументов следующим образом:

@a = (10,20,30,40);
@b = (50,70,60,200);
gd::plotpts($im,\@a,\@b,4,1); # Error!

Однако этот скрипт генерирует ошибку типа, а не действует так, как можно было бы ожидать.Хотя такое поведение может показаться ограничительным или странным, SWIG была специально разработана для работы таким образом.На самом деле, есть даже преимущества этого подхода.Если бы Perl-массивы использовались в качестве C-массивов, была бы сделана копия, проверена на корректность типов и освобождена каждый раз, когда массив передавался в C-функцию.Для больших массивов это привело бы к значительному снижению производительности.Требования к пространству также являются проблемой для некоторых программ на C.Например, числовое приложение может манипулировать массивами с миллионами элементов.Преобразование таких массивов в представление Perl и из него явно приведет к значительным затратам памяти и производительности.Напротив, манипулирование указателями на такие массивы является простым и эффективным.

Но я не совсем понимаю, почему это не так, может кто-нибудь проиллюстрирует более подробно!?

1 Ответ

1 голос
/ 28 июня 2011
Массивы

C сильно отличаются от массивов Perl. Массив Perl - это действительно структура C в сочетании с некоторой malloc редактируемой памятью. Вы не можете просто использовать массив Perl в качестве массива C. Таким образом, необходимо преобразовать массив Perl в массив C и, возможно, снова. Это не обязательно прямо вперед. Поэтому swig заставляет вас написать код для этого. Это то, что делают вспомогательные функции.

...