Не могу сделать функцию инлайновой. Почему?
От: neokoder  
Дата: 02.05.11 09:49
Оценка:
__forceinline int CompareStringsBinary(TCHAR *str1,TCHAR *str2)
{
   int rez;

   if ((str1==NULL)&&(str2!=NULL)) return CSTR_LESS_THAN;
   else if ((str1!=NULL)&&(str2==NULL)) return CSTR_GREATER_THAN;
   else if ((str1==NULL)&&(str2==NULL)) return CSTR_EQUAL;
   else
   {
      rez=_tcscmp(str1,str2);
      if (rez==_NLSCMPERROR) return 0;
      else return (rez+2);
   }
}


Смотрю в отладчике, всё равно происходит её вызов:
01313DE9  call        CompareStringsBinary (13111D6h)


Как заставить функцию быть инлайновой?
Re: Не могу сделать функцию инлайновой. Почему?
От: const_volatile  
Дата: 02.05.11 10:29
Оценка:
Здравствуйте, neokoder, Вы писали:

N>__forceinline int CompareStringsBinary(TCHAR *str1,TCHAR *str2)


N>Как заставить функцию быть инлайновой?


см. msdn

Even with __forceinline, the compiler cannot inline code in all circumstances. The compiler cannot inline a function if:

The function or its caller is compiled with /Ob0 (the default option for debug builds).
[...]

Re[2]: Не могу сделать функцию инлайновой. Почему?
От: neokoder  
Дата: 02.05.11 10:55
Оценка:
Здравствуйте, const_volatile, Вы писали:

Смотрел MSDN, видел эти исключения из правил. Просто не нашёл у себя в опциях командной строки /Ob0 и подумал, что вроде как её нет. Оказывается она включена по умолчанию.

То есть для Release-Версии она станет инлайновой?
И ещё , а как же мне тогда убедиться что функция стала инлайновая в Release-билде? Посмотреть то я не смогу в отладчике.
Re[3]: Не могу сделать функцию инлайновой. Почему?
От: Vain Россия google.ru
Дата: 02.05.11 10:58
Оценка:
Здравствуйте, neokoder, Вы писали:

N>Смотрел MSDN, видел эти исключения из правил. Просто не нашёл у себя в опциях командной строки /Ob0 и подумал, что вроде как её нет. Оказывается она включена по умолчанию.

N>То есть для Release-Версии она станет инлайновой?
N>И ещё , а как же мне тогда убедиться что функция стала инлайновая в Release-билде? Посмотреть то я не смогу в отладчике.
Почему не сможешь?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: Не могу сделать функцию инлайновой. Почему?
От: neokoder  
Дата: 02.05.11 11:49
Оценка:
Здравствуйте, Vain, Вы писали:

Да там как-то непонятно, такое ощущение что он для release-Версии не всё показывает, в частности я почему то там не увидел вызова функции _wcscmp. Вот дизассемблированный код:
if(CompareStringsBinary(ptr_paramname,_T("DEFAULT_LCID"))==CSTR_EQUAL)
000121ED mov ecx,offset string L"DEFAULT_LCID" (14E48h)
000121F2 mov eax,ebx
000121F4 mov dx,word ptr [eax]
000121F7 cmp dx,word ptr [ecx]
000121FA jne ReadIniParam+0EAh (1221Ah)
000121FC cmp dx,di
000121FF je ReadIniParam+0E6h (12216h)
00012201 mov dx,word ptr [eax+2]
00012205 cmp dx,word ptr [ecx+2]
00012209 jne ReadIniParam+0EAh (1221Ah)
0001220B add eax,4
0001220E add ecx,4
00012211 cmp dx,di
00012214 jne ReadIniParam+0C4h (121F4h)
00012216 xor eax,eax
00012218 jmp ReadIniParam+0EFh (1221Fh)
0001221A sbb eax,eax
0001221C sbb eax,0FFFFFFFFh
0001221F cmp eax,7FFFFFFFh
00012224 je $LN26+1 (12358h)
0001222A add eax,2
0001222D cmp eax,2
00012230 jne $LN26+1 (12358h)
Re[4]: Не могу сделать функцию инлайновой. Почему?
От: neokoder  
Дата: 02.05.11 11:51
Оценка: :)
...функции wcscmp.
Re[5]: Не могу сделать функцию инлайновой. Почему?
От: const_volatile  
Дата: 02.05.11 12:10
Оценка:
Здравствуйте, neokoder, Вы писали:

N>...функции wcscmp.


так она ж заинлайнена
Re[3]: Не могу сделать функцию инлайновой. Почему?
От: Pavel Dvorkin Россия  
Дата: 02.05.11 13:01
Оценка:
Здравствуйте, neokoder, Вы писали:

N>Здравствуйте, const_volatile, Вы писали:


N>Смотрел MSDN, видел эти исключения из правил. Просто не нашёл у себя в опциях командной строки /Ob0 и подумал, что вроде как её нет. Оказывается она включена по умолчанию.


N>То есть для Release-Версии она станет инлайновой?

N>И ещё , а как же мне тогда убедиться что функция стала инлайновая в Release-билде? Посмотреть то я не смогу в отладчике.

Во-первых, сможешь.
Во-вторых, можно поставить в опциях "генерировать листинг на ассемблере"
With best regards
Pavel Dvorkin
Re[4]: Не могу сделать функцию инлайновой. Почему?
От: neokoder  
Дата: 02.05.11 13:40
Оценка:
PD>Во-вторых, можно поставить в опциях "генерировать листинг на ассемблере"
Да, действительно нашёл такую опцию. Спасибо.
Re[6]: Не могу сделать функцию инлайновой. Почему?
От: neokoder  
Дата: 02.05.11 13:49
Оценка:
Здравствуйте, const_volatile, Вы писали:
_>так она ж заинлайнена

Вообще то в её объявлении я не видел никаких inline:
int __cdecl wcscmp (
        const wchar_t * src,
        const wchar_t * dst
        )
{
54714320  mov         edi,edi  
54714322  push        ebp  
54714323  mov         ebp,esp  
54714325  push        ecx  
        int ret = 0 ;
54714326  mov         dword ptr [ret],0  

        while( ! (ret = (int)(*src - *dst)) && *dst)
5471432D  mov         eax,dword ptr [src]  
54714330  movzx       ecx,word ptr [eax]  
54714333  mov         edx,dword ptr [dst]  
54714336  movzx       eax,word ptr [edx]  
54714339  sub         ecx,eax  
5471433B  mov         dword ptr [ret],ecx  
5471433E  jne         wcscmp+3Eh (5471435Eh)  
54714340  mov         ecx,dword ptr [dst]  
54714343  movzx       edx,word ptr [ecx]  
54714346  test        edx,edx  
54714348  je          wcscmp+3Eh (5471435Eh)  
                ++src, ++dst;
5471434A  mov         eax,dword ptr [src]  
5471434D  add         eax,2  
54714350  mov         dword ptr [src],eax  
54714353  mov         ecx,dword ptr [dst]  
54714356  add         ecx,2  
54714359  mov         dword ptr [dst],ecx  
5471435C  jmp         wcscmp+0Dh (5471432Dh)  

        if ( ret < 0 )
5471435E  cmp         dword ptr [ret],0  
54714362  jge         wcscmp+4Dh (5471436Dh)  
                ret = -1 ;
54714364  mov         dword ptr [ret],0FFFFFFFFh  
5471436B  jmp         wcscmp+5Ah (5471437Ah)  
        else if ( ret > 0 )
5471436D  cmp         dword ptr [ret],0  
54714371  jle         wcscmp+5Ah (5471437Ah)  
                ret = 1 ;
54714373  mov         dword ptr [ret],1  

        return( ret );
5471437A  mov         eax,dword ptr [ret]  
}
5471437D  mov         esp,ebp  
5471437F  pop         ebp  
54714380  ret
Re[6]: Не могу сделать функцию инлайновой. Почему?
От: neokoder  
Дата: 02.05.11 13:57
Оценка:
Здравствуйте, const_volatile, Вы писали:
_>так она ж заинлайнена

А, блин, не увидел следующий код в листине #pragma function(wcscmp). Так что она действительно инлайновая получается.

А кстати какая разница в способах определения функции как инлайновой:
1) inline,__forceinline
2)#pragma function
Re[3]: Не могу сделать функцию инлайновой. Почему?
От: MasterZiv СССР  
Дата: 02.05.11 16:36
Оценка:
On 02.05.2011 14:55, neokoder wrote:

Почитай ещё про разницу между inlime и __inline

> И ещё , а как же мне тогда убедиться что функция стала инлайновая в

> Release-билде?

Вывести на этапе линковки карту сборки (.map), поглядеть
в словарь глобальных символов, твоей функции не должно там в итоге
быть или она может быть, но ссылок на неё не должно быть.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: Не могу сделать функцию инлайновой. Почему?
От: neokoder  
Дата: 03.05.11 03:34
Оценка:
Здравствуйте, MasterZiv, Вы писали:
MZ>Почитай ещё про разницу между inlime и __inline


Технически не никаких различий:

The inline keyword is available only in C++. The __inline and __forceinline keywords are available in both C and C++.
The __inline keyword is equivalent to inline.

Re[5]: Не могу сделать функцию инлайновой. Почему?
От: MasterZiv СССР  
Дата: 03.05.11 07:30
Оценка:
On 03.05.2011 7:34, neokoder wrote:

> Технически не никаких различий:

>
> The inline keyword is available only in C++. The __inline and __forceinline
> keywords are available in both C and C++.
> *The __inline keyword is equivalent to inline.*

Извиняюсь, имел в виду __forceinline, естественно.
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.