hvdberg: Die eerste ziet er niet echt uit als een inline functie, er wordt een compleet stack frame opgebouwd. Je moet altijd opletten als je dit soort dingen test, met name de assembler output kan nogal verschillen als je extra code toevoegt of bepaalde condities gelden (bijvoorbeeld als de input een constante is wordt er niet eens code gegenereerd). VC 7.1 maakt er iig in beide gevallen dit van:
code:
1
2
3
4
| test eax, eax
jge .pos
neg eax
.pos: |
edit:
Je krijgt trouwens wel verschil als je de functies nest (wat zowieso nutteloos is en weggeoptimaliseerd zou kunnen worden):
C++:
1
2
3
4
5
6
7
8
9
| int entry(int val)
{
return DefineAbsolute(DefineAbsolute(val));
}
//--- of ---
int entry(int val)
{
return InlineAbsolute(InlineAbsolute(val));
} |
De eerste genereert:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| mov eax,[esp][00004]
test eax,eax
mov ecx,eax
jge .a
neg ecx
.a:
test ecx,ecx
jge .b
test eax,eax
jge .c
neg eax
neg eax
retn
.b:
test eax,eax
jge .d
.c:
neg eax
.d:
retn |
Een hoop nutteloze code dus (zelfs 2x neg eax achter elkaar

), terwijl de inline variant er dit van maakt:
code:
1
2
3
4
5
6
7
8
9
| mov eax,[esp][00004]
test eax,eax
jge .a
neg eax
test eax,eax
jge .a
neg eax
a:
retn |
Een stuk kleiner dus, maar wel valt op dat ook deze niet optimaal is, er staat eigenlijk gewoon 2 keer dezelfde code achter elkaar, terwijl de 2e weg zou kunnen. Maar iig al een stuk beter dan die define.
Omdat bij die define de functie binnen de haakjes gewoon 3 keer als 'x' gebruikt wordt in dezelfde functie, is het voor de compiler waarschijnlijk lastiger de verbanden te zien dan bij een inline functie die 1 keer genest is. De inline variant is hierbij dus ook duidelijk in het voordeel.
Conclusie: geen defines gebruiken voor iets dat je ook als inline functie kunt maken

.
[
Voor 63% gewijzigd door
madwizard op 09-12-2003 15:44
]