[Lazarus] Example requested for TList and Sort using data type of Object (or record).
Sven Barth
pascaldragon at googlemail.com
Wed May 11 22:00:08 CEST 2011
On 11.05.2011 20:50, Graeme Geldenhuys wrote:
> On 11 May 2011 14:35, Sven Barth<pascaldragon at goo*****> wrote:
>> function SortComponentsForName(Item1, Item2: Pointer): Integer;
>> var
>> Comp1, Comp2: TComponent;
>> begin
>> Comp1 := TComponent(Item1);
>> Comp2 := TComponent(Item2);
>
>
> This is what I have always been using.... Is one method more efficient
> (generated code) than the other?
The "absolute" version needs (in the example) 2 * SizeOf(Pointer) less
stack space and also the two assignments aren't needed.
Example:
===source begin===
procedure Test1(aParam1, aParam2: Pointer);
var
param1: TObject absolute aParam1;
param2: TObject absolute aParam2;
begin
end;
procedure Test2(aParam1, aParam2: Pointer);
var
param1: TObject;
param2: TObject;
begin
param1 := TObject(aParam1);
param2 := TObject(aParam2);
end;
===source end===
The following code is generated on i386:
===assembler begin===
.section .text
.balign 16,0x90
.globl P$ABSOLUTETEST_TEST1$POINTER$POINTER
.type P$ABSOLUTETEST_TEST1$POINTER$POINTER, at function
P$ABSOLUTETEST_TEST1$POINTER$POINTER:
.Lc1:
# Temps allocated between ebp-8 and ebp-8
# [absolutetest.pas]
# [9] begin
pushl %ebp
.Lc3:
.Lc4:
movl %esp,%ebp
.Lc5:
subl $8,%esp
# Var aParam1 located at ebp-4
# Var aParam2 located at ebp-8
movl %eax,-4(%ebp)
movl %edx,-8(%ebp)
# [10] end;
leave
ret
.Lc2:
.Le0:
.size P$ABSOLUTETEST_TEST1$POINTER$POINTER, .Le0 -
P$ABSOLUTETEST_TEST1$POINTER$POINTER
.section .text
.balign 16,0x90
.globl P$ABSOLUTETEST_TEST2$POINTER$POINTER
.type P$ABSOLUTETEST_TEST2$POINTER$POINTER, at function
P$ABSOLUTETEST_TEST2$POINTER$POINTER:
.Lc6:
# Temps allocated between ebp-16 and ebp-16
# [16] begin
pushl %ebp
.Lc8:
.Lc9:
movl %esp,%ebp
.Lc10:
subl $16,%esp
# Var aParam1 located at ebp-4
# Var aParam2 located at ebp-8
# Var param1 located at ebp-12
# Var param2 located at ebp-16
movl %eax,-4(%ebp)
movl %edx,-8(%ebp)
# [17] param1 := TObject(aParam1);
movl -4(%ebp),%eax
movl %eax,-12(%ebp)
# [18] param2 := TObject(aParam2);
movl -8(%ebp),%eax
movl %eax,-16(%ebp)
# [19] end;
leave
ret
.Lc7:
.Le1:
.size P$ABSOLUTETEST_TEST2$POINTER$POINTER, .Le1 -
P$ABSOLUTETEST_TEST2$POINTER$POINTER
===assembler end===
Regards,
Sven
More information about the Lazarus
mailing list