Jak działa funkcja typu inline?

0

Dajmy sobie prosty kod:

inline int xxx()
{
	return 5;
}


int main()
{
	int x = 4;
	
	x = xxx();

	return 0;
}

Teraz skompilujmy ten kod pod GCC z opcją --save-temps i zobaczmy, co wyrzucił do pliku *.s:

	.file	"1.c"
	.text
.globl xxx
	.type	xxx, @function
xxx:
	pushl	%ebp
	movl	%esp, %ebp
	movl	$5, %eax
	popl	%ebp
	ret
	.size	xxx, .-xxx
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$16, %esp
	movl	$4, -4(%ebp)
	call	xxx
	movl	%eax, -4(%ebp)
	movl	$0, %eax
	leave
	ret
	.size	main, .-main
	.ident	"GCC: (Ubuntu 4.4.3-4ubuntu1) 4.4.3"
	.section	.note.GNU-stack,"",@progbits

Wszędzie piszą, że funkcje inline nie są kompilowane jako funkcje, a po prostu ich kod jest wrzucany w miejscu wywołania. Coś chyba to nie działa

0

Wszystko zalezy od kompilatora i ustawionych flag optymalizacji przy kompilacji kodu.
Tak naprawde inline sugeruje kompilatorowi nie tworzyc funkcji tylko jej zawartosc umiescic tam gdzie jest jej wywolanie.
Podobnie jest z modyfikatorem register, tak samo jest to tylko sugestia dla kompilatora.

0

Gcc ma odpowiednią flagę odpowiedzialną za inlinowanie funkcji ;)
Jak nie chce ci się szukac to wrzuć -O3 i powinno zadziałać.

0

Można jeszcze spróbować -Os

0

To najczesciej zalatwi sprawe w gcc.

-finline-functions

Opcja O3 dolacza ta flage, a co do opcji Os to nie ma zadnych flag dotyczacych funkcji inline

0

@pcmcymc -Os na pewno nie będzie inlinowało. To jest flaga która daje -O2 + zmniejszanie rozmiaru pliku wynikowego. Inlinowanie funkcji plik wynikowy zwiększa wiec siłą rzeczy tej flagi -Os nie może dołączać, bo było to bez sensu ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1