函数应该return一个记录还是一个指针?
Function should return a record or a pointer?
假设我有一个 "heavy" 记录,例如包含多个动态值数组。我这样声明:
PMyHugeRecord^ = TMyHugeRecord;
TMyHugeRecord = record
AFirstArray: TSingleDynArray;
// many many others
...
ALastArray: TSingleDynArray;
end;
虽然处理是在函数中进行的,但函数的结果应该作为指针输入类型,还是可以 return 记录变量?
function MyFunctionWhichCalculates: TMyHugeRecord;
// or
function MyFunctionWhichCalculates: PMyHugeRecord;
我的意思是在性能方面,尤其是为了避免堆栈溢出。换句话说,函数 return 是按引用还是按值的结果?
您可以return一条记录。它是否是 "heavy" 并不重要,因为在现实中,它将作为参考参数传入,换句话说 就好像 你已经声明:
procedure MyFunctionWhichCalculates(var Result: TMyHugeRecord);
不要 return 指针,即使您使用 New()
分配了记录,因为这会使用户承担通过指针 Dispose()
-ing 记录的负担。这在同一个应用程序中没有问题(但仍然是负担),这是跨模块边界的问题,因为不同的内存管理器。总之,不推荐。
假设我有一个 "heavy" 记录,例如包含多个动态值数组。我这样声明:
PMyHugeRecord^ = TMyHugeRecord;
TMyHugeRecord = record
AFirstArray: TSingleDynArray;
// many many others
...
ALastArray: TSingleDynArray;
end;
虽然处理是在函数中进行的,但函数的结果应该作为指针输入类型,还是可以 return 记录变量?
function MyFunctionWhichCalculates: TMyHugeRecord;
// or
function MyFunctionWhichCalculates: PMyHugeRecord;
我的意思是在性能方面,尤其是为了避免堆栈溢出。换句话说,函数 return 是按引用还是按值的结果?
您可以return一条记录。它是否是 "heavy" 并不重要,因为在现实中,它将作为参考参数传入,换句话说 就好像 你已经声明:
procedure MyFunctionWhichCalculates(var Result: TMyHugeRecord);
不要 return 指针,即使您使用 New()
分配了记录,因为这会使用户承担通过指针 Dispose()
-ing 记录的负担。这在同一个应用程序中没有问题(但仍然是负担),这是跨模块边界的问题,因为不同的内存管理器。总之,不推荐。