加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 函数参数中的高效指针处理

发布时间:2020-12-15 04:23:33 所属栏目:大数据 来源:网络整理
导读:正如上面的主题所示,我想知道是否有一个很好的例子来处理在按顺序处理数据时在函数parms中传递的指针.我所拥有的是: function myfunc(inptr: pointer; inptrsize: longint): boolean; var inproc: pointer; i: integer; begin inproc := inptr; for i := 1
正如上面的主题所示,我想知道是否有一个很好的例子来处理在按顺序处理数据时在函数parms中传递的指针.我所拥有的是:
function myfunc(inptr: pointer; inptrsize: longint): boolean;
   var
     inproc: pointer;
     i: integer;
   begin
     inproc := inptr;
     for i := 1 to inptrsize do
       begin
         // do stuff against byte data here.
         inc(longint(inproc),1);
       end;
   end;

我的想法是,不管有多大的数据,我都希望它能够处理被推送的任何数据,而不是有限的数据.

现在谈到处理数据时,我已经想出了几种成功的方法.

>将parm指针分配给相同的临时指针,然后使用它们访问每个数据,递增它们以继续前进.这种方法是最快的,但不是很干净,所有指针增量遍布整个代码. (这就是我上面所说的)
>将parm指针分配给表示大数组值的指针,然后使用标准表逻辑对其进行递增处理.更清洁,但比#1慢约500毫秒.

有没有其他方法以这种方式有效地处理处理指针,或者是否有一些我缺少的方法,既干净又不浪费时间?

解决方法

你的代码基本上没问题.我总是选择增加指针而不是强制转换为假数组.

但是你不应该转换为整数.这在语义上是错误的,只要您在指针大小与整数大小不同的平台上编译,您就会支付罚金.始终使用指向正确大小的元素的指针.在这种情况下,指向byte的指针.

function MyFunc(Data: PByte; Length: Integer): Boolean;
var
  i: Integer;
begin
  for i := 1 to Length do
  begin
    // do stuff against byte data here.
    inc(Data);
  end;
end;

除非编译器有一个非常糟糕的一天,否则你会发现很难获得比这更好的代码.更重要的是,我认为这种风格实际上相当清晰,易于理解.大部分的清晰度增加都是为了避免投射.始终努力从代码中删除强制转换.

如果你想允许传递任何指针类型,那么你可以像这样写:

function MyFunc(P: Pointer; Length: Integer): Boolean;
var
  i: Integer;
  Data: PByte;
begin
  Data := P;
  for i := 1 to Length do
  begin
    // do stuff against byte data here.
    inc(Data);
  end;
end;

或者,如果要避免在接口中使用指针,则使用无类型的const参数.

function MyFunc(const Buffer; Length: Integer): Boolean;
var
  i: Integer;
  Data: PByte;
begin
  Data := PByte(@Buffer);
  for i := 1 to Length do
  begin
    // do stuff against byte data here.
    inc(Data);
  end;
end;

如果需要修改缓冲区,请使用var参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读