Доброго времени суток!
Пишу что-то вроде:
inline DWORD Zstrlen(PCHAR str) {
DWORD i = 0;
for (; str[i] != '\0'; i++);
return i;
}
...
DWORD ln0 = Zstrlen(str0);
И получаю:
PUBLIC ?Zstrlen@@YAKPAD@Z ; Zstrlen
; Function compile flags: /Ogspy
; COMDAT ?Zstrlen@@YAKPAD@Z
_TEXT SEGMENT
_str$ = 8 ; size = 4
?Zstrlen@@YAKPAD@Z PROC ; Zstrlen, COMDAT
; 330 : DWORD i = 0;
; 331 : for (; str[i] != '\0'; i++);
mov ecx, DWORD PTR _str$[esp-4]
xor eax, eax
cmp BYTE PTR [ecx], al
je SHORT $LN1@Zstrlen
$LL3@Zstrlen:
inc eax
cmp BYTE PTR [eax+ecx], 0
jne SHORT $LL3@Zstrlen
$LN1@Zstrlen:
; 332 : return i;
; 333 : }
ret 0
?Zstrlen@@YAKPAD@Z ENDP ; Zstrlen
_TEXT ENDS
...
; 336 : DWORD ln0 = Zstrlen(str0);
mov edx, DWORD PTR _str0$[esp-4]
push esi
xor esi, esi
cmp BYTE PTR [edx], 0
je SHORT $LN8@Zstrcmp
$LL10@Zstrcmp:
Как же заставить компилятор отказаться от call, от прыжков различных (je) — т.е. чтобы он вставлял код функции прямо в код, где она вызывается?
Судя по всему, префикс inline не помогает.