На этот раз решил проверить сам.
Компиляция "fpc -a -XX -CX -O3 -Xs test1.pas":
Код: Выделить всё
program test1;
{$mode objfpc}{h+}
{$interfaces corba}
uses
unit1;
var
cl1: class1;
cl2: class2;
begin
cl1:= class1.create;
writeln(ifunc1(cl1,2));
cl2:= class2.create;
writeln(ifunc1(cl2,2));
end.
и
Код: Выделить всё
unit unit1;
{$mode objfpc}{h+}
{$interfaces corba}
interface
type
int1 = interface
function f1(const arg1:integer): boolean;
end;
class1 = class(int1)
function f1(const arg1:integer): boolean; virtual;
end;
class2 = class(int1)
function f1(const arg1:integer): boolean; virtual;
end;
function ifunc1(const arg1: int1; const val:integer): boolean;
implementation
function class1.f1(const arg1:integer): boolean;
begin
result:= arg1 > 0;
end;
function class2.f1(const arg1:integer): boolean;
begin
result:= arg1 < 0;
end;
function ifunc1(const arg1: int1; const val:integer): boolean;
begin
result:= arg1.f1(val);
end;
end.
дает ASM-код:
Код: Выделить всё
.file "test.pas"
# Begin asmlist al_begin
# End asmlist al_begin
# Begin asmlist al_stabs
# End asmlist al_stabs
# Begin asmlist al_procedures
.section .text.n__main
.balign 16,0x90
.globl PASCALMAIN
PASCALMAIN:
.globl _main
_main:
subl $8,%esp
movl %ebx,(%esp)
movl %esi,4(%esp)
call FPC_INITIALIZEUNITS
movl $0,%eax
movl $VMT_UNIT1_CLASS1,%edx
call SYSTEM_TOBJECT_$__CREATE$$TOBJECT
movl %eax,%ebx
call fpc_get_output
movl %eax,%esi
movl %ebx,%eax
testl %ebx,%ebx
je .Lj15
addl $4,%eax
.Lj15:
movl $2,%edx
call UNIT1_IFUNC1$INT1$LONGINT$$BOOLEAN
movb %al,%cl
movl $0,%ebx
movl %esi,%edx
movl %ebx,%eax
call fpc_write_text_boolean
call FPC_IOCHECK
movl %esi,%eax
call fpc_writeln_end
call FPC_IOCHECK
movl $VMT_UNIT1_CLASS2,%edx
movl $0,%eax
call SYSTEM_TOBJECT_$__CREATE$$TOBJECT
movl %eax,%esi
call fpc_get_output
movl %eax,%ebx
movl %esi,%eax
testl %esi,%esi
je .Lj36
addl $4,%eax
.Lj36:
movl $2,%edx
call UNIT1_IFUNC1$INT1$LONGINT$$BOOLEAN
movb %al,%cl
movl %ebx,%edx
movl $0,%eax
call fpc_write_text_boolean
call FPC_IOCHECK
movl %ebx,%eax
call fpc_writeln_end
call FPC_IOCHECK
call FPC_DO_EXIT
movl (%esp),%ebx
movl 4(%esp),%esi
addl $8,%esp
ret
# End asmlist al_procedures
# Begin asmlist al_globals
.section .bss
.balign 4
.comm U_P$TEST1_CL1,4
.section .bss
.balign 4
.comm U_P$TEST1_CL2,4
.section .data.n_THREADVARLIST_P$TEST1
.balign 4
.globl THREADVARLIST_P$TEST1
THREADVARLIST_P$TEST1:
.long 0
.section .data.n_INITFINAL
.balign 4
.globl INITFINAL
INITFINAL:
.long 2,0
.long INIT$_SYSTEM
.long 0
.long INIT$_OBJPAS
.long FINALIZE$_OBJPAS
.section .data.n_FPC_THREADVARTABLES
.balign 4
.globl FPC_THREADVARTABLES
FPC_THREADVARTABLES:
.long 5
.long THREADVARLIST_SYSTEM
.long THREADVARLIST_OBJPAS
.long THREADVARLIST_UNIT1
.long THREADVARLIST_SYSINITPAS
.long THREADVARLIST_P$TEST1
.section .data.n_FPC_RESOURCESTRINGTABLES
.balign 4
.globl FPC_RESOURCESTRINGTABLES
FPC_RESOURCESTRINGTABLES:
.long 0
.section .fpc.n_version
.balign 16
.ascii "FPC 2.2.3 [2009/08/14] for i386 - Win32"
.section .data.n___heapsize
.balign 4
.globl __heapsize
__heapsize:
.long 0
.section .data.n___fpc_valgrind
.globl __fpc_valgrind
__fpc_valgrind:
.byte 0
или без виртуальности функции:
Код: Выделить всё
.section .text.n__main
.balign 16,0x90
.globl PASCALMAIN
PASCALMAIN:
.globl _main
_main:
subl $8,%esp
movl %ebx,(%esp)
movl %esi,4(%esp)
call FPC_INITIALIZEUNITS
movl $0,%eax
movl $VMT_UNIT1_CLASS1,%edx
call SYSTEM_TOBJECT_$__CREATE$$TOBJECT
movl %eax,%ebx
call fpc_get_output
movl %eax,%esi
movl %ebx,%eax
testl %ebx,%ebx
je .Lj15
addl $4,%eax
.Lj15:
movl $2,%edx
call UNIT1_IFUNC1$INT1$LONGINT$$BOOLEAN
movb %al,%cl
movl $0,%ebx
movl %esi,%edx
movl %ebx,%eax
call fpc_write_text_boolean
call FPC_IOCHECK
movl %esi,%eax
call fpc_writeln_end
call FPC_IOCHECK
movl $VMT_UNIT1_CLASS2,%edx
movl $0,%eax
call SYSTEM_TOBJECT_$__CREATE$$TOBJECT
movl %eax,%esi
call fpc_get_output
movl %eax,%ebx
movl %esi,%eax
testl %esi,%esi
je .Lj36
addl $4,%eax
.Lj36:
movl $2,%edx
call UNIT1_IFUNC1$INT1$LONGINT$$BOOLEAN
movb %al,%cl
movl %ebx,%edx
movl $0,%eax
call fpc_write_text_boolean
call FPC_IOCHECK
movl %ebx,%eax
call fpc_writeln_end
call FPC_IOCHECK
call FPC_DO_EXIT
movl (%esp),%ebx
movl 4(%esp),%esi
addl $8,%esp
ret
# End asmlist al_procedures
# Begin asmlist al_globals
.section .bss
.balign 4
.comm U_P$TEST1_CL1,4
.section .bss
.balign 4
.comm U_P$TEST1_CL2,4
.section .data.n_THREADVARLIST_P$TEST1
.balign 4
.globl THREADVARLIST_P$TEST1
THREADVARLIST_P$TEST1:
.long 0
.section .data.n_INITFINAL
.balign 4
.globl INITFINAL
INITFINAL:
.long 2,0
.long INIT$_SYSTEM
.long 0
.long INIT$_OBJPAS
.long FINALIZE$_OBJPAS
.section .data.n_FPC_THREADVARTABLES
.balign 4
.globl FPC_THREADVARTABLES
FPC_THREADVARTABLES:
.long 5
.long THREADVARLIST_SYSTEM
.long THREADVARLIST_OBJPAS
.long THREADVARLIST_UNIT1
.long THREADVARLIST_SYSINITPAS
.long THREADVARLIST_P$TEST1
.section .data.n_FPC_RESOURCESTRINGTABLES
.balign 4
.globl FPC_RESOURCESTRINGTABLES
FPC_RESOURCESTRINGTABLES:
.long 0
.section .fpc.n_version
.balign 16
.ascii "FPC 2.2.3 [2009/08/14] for i386 - Win32"
.section .data.n___heapsize
.balign 4
.globl __heapsize
__heapsize:
.long 0
.section .data.n___fpc_valgrind
.globl __fpc_valgrind
__fpc_valgrind:
.byte 0
Как видите - нет в нем никаких лишних вызовов.