Принудительный inline
От: gribodemon  
Дата: 26.08.09 10:20
Оценка:
Доброго времени суток!
Пишу что-то вроде:

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 не помогает.
принудительный inline
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.