为啥 SWIG 需要辅助函数来处理数组?
Posted
技术标签:
【中文标题】为啥 SWIG 需要辅助函数来处理数组?【英文标题】:Why SWIG requires helper functions to deal with array?为什么 SWIG 需要辅助函数来处理数组? 【发布时间】:2011-06-27 14:26:30 【问题描述】:引用自here:
理想情况下,用户可能希望通过 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】:C 数组与 Perl 数组非常不同。 Perl 数组实际上是结合了一些malloc
ed 内存的C 结构。您不能简单地将 Perl 数组用作 C 数组。因此需要将 Perl 数组转换为 C 数组并可能再次转换回来。这不一定是直截了当的。因此 swig 迫使你编写代码来完成它。这就是辅助函数的作用。
【讨论】:
我认为答案没有一针见血。这对于我的具体问题来说太笼统了。 很抱歉,仅此而已。您不能将 Perl 5 数组用作 C 数组,因此您必须对其进行转换。转换很重要,因此您需要使用辅助函数来完成。您可能想澄清您对此不了解的地方。 你提到了A Perl array is really a C structure combined with some malloced memory
,有没有参考check out?
我见过的最好的是PerlGuts Illustrated,但也有perldoc perlguts
。以上是关于为啥 SWIG 需要辅助函数来处理数组?的主要内容,如果未能解决你的问题,请参考以下文章