gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:06:18 27 4
gpt4 key购买 nike

正如上面的主题所示,我想知道是否有一个很好的例子,说明在按顺序处理数据时,是否有一个干净而有效的方法来处理函数参数中传递的指针。我所拥有的是这样的:

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;

我的想法是,我希望它能够处理任何推送的数据,无论大小,而不是有限的数据。

现在,在处理数据时,我已经找到了几种成功完成此操作的方法。

  1. 将 parm 指针分配给相同的临时指针,然后使用它们来访问每条数据,递增它们以继续。此方法速度最快,但看起来不太干净,所有指针增量都分布在代码中。 (这就是我上面说的)
  2. 将 parm 指针分配给表示大数组值的指针,然后使用标准表逻辑增量处理该值。干净得多,但比 #1 慢了大约 500 毫秒。

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

最佳答案

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

但是你不应该转换为整数。这在语义上是错误的,只要您在指针大小与整数大小不同的平台上进行编译,您就会付出代价。始终使用指向正确大小的元素的指针。在本例中是指向字节的指针。

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;

或者,如果您想避免接口(interface)中的指针,请使用非类型化 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 参数。

关于delphi - 函数参数中的高效指针处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13997397/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com