PB调用C结构体数组,请使用blob的方式,快10倍不止

C中结构体定义如下

typedef struct srcobj {
    int line;
    int objline;
    char objtype[255];
    char objname[255];
    char data[7*1024 + 10];// 长度对齐
}pbsrc;
//s 为 srcobj s[500];
long __stdcall pb_search(char * src, char * regstr, srcobj * s) ;

pb中定义如下

type srcobj from structure
	unsignedlong line
	unsignedlong objline
	char objtype[255]
	char objname[255]
	char data[7178]
end type
//这两种定义是正常的
function long pb_search(string s,string p ,ref blob s)library "easypj.dll"
function long pb_search(string s,string p ,ref srcobj s[] )library "easypj.dll"
// 下面两种定义插入的数据会是错误的
function long pb_search(string s,string p ,ref srcobj s)library "easypj.dll"
function long pb_search(string s,string p ,ref unsignedlong _srcobj_line)library "easypj.dll"

解释一下 ref srcobj s 和 ref unsignedlong _srcobj_line这种尝试的原因

在C语言中

srcobj s[500];
s == &s[0] == & s[0].line
//在c中这三种写法取到的指针都是结构体数组指向结构体数组s开始位置

在pb中则不是这样子的

/*
实例变量
blob ib_isobj
sobj isobj_t[500]
*/
//ib_isobj 指向 0x7f23003c 这个指向地址不会变化
c = this.pb_search(src, regstr, ib_isobj)//方式1
//ref isobj_t 指向 0x13a40040 每次都不一样 
pb_search(src, regstr, ref isobj_t)//方式2
//ref isobj_t[1]指向 0x13a461d8 每次都不一样
pb_search(src, regstr, ref isobj_t[1])//无效方式1
//isobj_t[1].line 指向 0x0e7303f8 每次都不一样
pb_search(src, regstr, ref isobj_t[1].line)//无效方式2

1 无效方式1和无效方式2 都表名 ref isobj_t[1].line ,ref isobj_t[1] 和 ref isobj_t 指针完全不一样所以不能和c一样等效处理

2 针对方式2,传到c后指针会变化,这个说明传入到c中的结构体会发生内存拷贝操作,传入的是拷贝出来的数据。所以pb中数组存放和c并不一样,只是在调用的时候会生成一个和c一样的结构传入到动态库,调用完了后再把对应的数据同步会结构体上

所以 对结构体数组引用在pb中每次都会拷贝一份数据到内存不同的位置,并不是传的实例变量的原始指针。因为我这个场景下sobj这个结构体是比较巨大的,如果通过传递结构体指针的方式传递到c中每调用一次都会发生至少一次的内存拷贝这样是比较费时的所以方式1和方式2运行速度完全不可比,方式1只需要1秒能完成任务,方式二需要几分钟才能完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值