Visual C 2005에는 많은 Intrinsic 함수가 추가 되어 있습니다. 그 중 Lock-Free를 위해 많이 사용되는 Atomic Operation이 대부분 Intrinsic 함수로 지원되는데, 이것은 inline assembly를 사용하는 것과 동일한 효과를 발휘합니다.
아래 32비트 디스어셈블리 코드를 보면 Intrinsic 함수인 _InterlockedExchangeAdd 사용함으로써 함수 호출 없이 바로 에셈블리 코드가 삽입되는 것을 볼 수 있습니다.
Intrinsic 함수는 특히 inline assembly가 지원되지 않는 64비트 프로그램 제작에 매우 유용한데 아래 x64 디스어셈블리 코드를 보면, Intrinsic 함수가 아닌 윈도우즈 API함수도 Intrinsic과 동일하게 최적화 되고 있는 것을 알 수 있습니다.
아래 32비트 디스어셈블리 코드를 보면 Intrinsic 함수인 _InterlockedExchangeAdd 사용함으로써 함수 호출 없이 바로 에셈블리 코드가 삽입되는 것을 볼 수 있습니다.
InterlockedExchangeAdd(&inc2, 0xffff);
00401001 push 0FFFFh
00401006 lea eax,[esp+4]
0040100A push eax
0040100B mov dword ptr [esp+8],1234h
00401013 call dword ptr [__imp__InterlockedExchangeAdd@8 (402000h)]
_InterlockedExchangeAdd(&inc2, 0xffff);
00401019 mov ecx,0FFFFh 0040101E lea edx,[esp]
00401021 lock xadd dword ptr [edx],ecx
00401001 push 0FFFFh
00401006 lea eax,[esp+4]
0040100A push eax
0040100B mov dword ptr [esp+8],1234h
00401013 call dword ptr [__imp__InterlockedExchangeAdd@8 (402000h)]
_InterlockedExchangeAdd(&inc2, 0xffff);
00401019 mov ecx,0FFFFh 0040101E lea edx,[esp]
00401021 lock xadd dword ptr [edx],ecx
Intrinsic 함수는 특히 inline assembly가 지원되지 않는 64비트 프로그램 제작에 매우 유용한데 아래 x64 디스어셈블리 코드를 보면, Intrinsic 함수가 아닌 윈도우즈 API함수도 Intrinsic과 동일하게 최적화 되고 있는 것을 알 수 있습니다.
InterlockedExchangeAdd(&inc2, 0xffff);
0000000140001008 mov eax,0FFFFh
000000014000100D lock xadd dword ptr [inc2],eax
_InterlockedExchangeAdd(&inc2, 0xeeee);
0000000140001013 mov ecx,0EEEEh
0000000140001018 lock xadd dword ptr [inc2],ecx
0000000140001008 mov eax,0FFFFh
000000014000100D lock xadd dword ptr [inc2],eax
_InterlockedExchangeAdd(&inc2, 0xeeee);
0000000140001013 mov ecx,0EEEEh
0000000140001018 lock xadd dword ptr [inc2],ecx
