Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 函数应该返回记录还是指针?_Delphi_Delphi 2007 - Fatal编程技术网

Delphi 函数应该返回记录还是指针?

Delphi 函数应该返回记录还是指针?,delphi,delphi-2007,Delphi,Delphi 2007,假设我有一个“重”记录,例如包含多个动态值数组。我这样宣布: PMyHugeRecord^ = TMyHugeRecord; TMyHugeRecord = record AFirstArray: TSingleDynArray; // many many others ... ALastArray: TSingleDynArray; end; 当处理在函数中进行时,函数的结果应该被类型化为指针,还是可以返回记录变量 function MyFunctionWhichCalc

假设我有一个“重”记录,例如包含多个动态值数组。我这样宣布:

PMyHugeRecord^ = TMyHugeRecord;
TMyHugeRecord = record
  AFirstArray: TSingleDynArray;
  // many many others
  ...  
  ALastArray: TSingleDynArray;
end;
当处理在函数中进行时,函数的结果应该被类型化为指针,还是可以返回记录变量

function MyFunctionWhichCalculates: TMyHugeRecord;
// or
function MyFunctionWhichCalculates: PMyHugeRecord;

我的意思是在性能方面,特别是为了避免堆栈溢出。换句话说,函数是通过引用还是通过值返回结果?

您可以返回记录。它是否“重”并不重要,实际上,它将作为引用参数传入,换句话说,就像您声明:

procedure MyFunctionWhichCalculates(var Result: TMyHugeRecord);

即使使用
New()
分配了记录,也不要返回指针,因为这会让用户承担通过指针删除记录的
Dispose()
。这在同一个应用程序中没有问题(但仍然是一个负担),这是一个跨模块边界的问题,因为内存管理器不同。总而言之,不建议这样做。

这在同一个应用程序中没有问题。即使在同一个应用程序中,这也是一个问题,因为手动跟踪生命周期比让编译器跟踪要困难得多。我的意思是,不同的内存管理器不会有问题。用户的负担或多或少是一样的。无论如何,您不能在具有不同内存管理器的模块之间传递此记录。这是一种托管类型。因此,你的答案的这一部分是有点无意义的。除此之外,你说得很对,指针在这里是个很糟糕的主意。因为托管类型。当该记录最终确定时,该记录的dyn数组成员将最终确定。使用错误的内存管理器。这就是我不推荐它的原因。只是想指出,你描述的记录可能没有你想象的那么“沉重”。动态数组在堆上分配,引用计数。记录结构保存对数组的“轻”引用。默认字符串(长字符串)类似。但是,如果您有固定大小的数组,那么您的结构可能会很大。您可以使用
SizeOf(…)
来确定数组的大小。您是对的,我的示例不是最好的。事实上,我的记录可以是各种数据类型的混合,包括固定大小的数组甚至其他记录。我可能夸大其词,但我总是对优化我的代码感兴趣。优化代码的唯一可靠方法是结合使用基准测试和评测,并测试特定更改的差异。直觉往往会产生误导。我要强调的是,让大部分代码易于维护,以便在需要微调性能的地方更容易安全地调整代码,这是一个非常重要的好处。这是一个性能问题。您在衡量绩效时看到了什么结果?这是你的答案。@RobKennedy,我没有。然而但是,如果一个广为人知的技术是一个必须要做的练习,我宁愿使用它,不管获得的纯性能增益如何。