Microsoft MVP성태의 닷넷 이야기
.NET Framework: 633. C# - IL 코드 분석을 위한 팁 [링크 복사], [링크+제목 복사],
조회: 23953
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)

C# - IL 코드 분석을 위한 팁

다음과 같은 질문이 있군요. ^^

++ 후위연산자와 = 을 함께 사용할 때 생성되는 IL 코드 관련...
; https://www.sysnet.pe.kr/3/0/4796

그러니까 다음의 코드를 컴파일했는데,

void Main()
{
    int testValue = 0;
    testValue = testValue ++;
    Console.WriteLine(testValue);
}

생성된 IL 코드가 이런 식이었다는 것입니다. (nop은 제거했습니다.)

IL_0001: ldc.i4.0 
IL_0002: stloc.0 // testValue
IL_0003: ldloc.0 // testValue
IL_0004: stloc.1 
IL_0005: ldloc.1 
IL_0006: ldc.i4.1 
IL_0007: add 
IL_0008: stloc.0 // testValue
IL_0009: ldloc.1 
IL_000A: stloc.0 // testValue
IL_000B: ldloc.0 // testValue
IL_000C: call System.Console.WriteLine
IL_0012: ret

근데... 사실 IL 출력이 이상하다기보다는 입력부터가 이상하다고 생각해야 합니다. 즉, 아래의 코드가 이상해도 ... 너무 이상한 것입니다. ^^

testValue = testValue ++;

testValue가 후위 연산자라서 값을 증가시켜야 하는데, 증가시킨 값을 무색하게 결국 0으로 돌려야 하는 것입니다. 위의 IL 코드를 2개의 코드로 나누면 결국 다음과 같습니다.

testValue = testValue + 1;
testValue = 0;

또는, testValue + 1의 변수를 다음과 같이 임시 변수로 쓸 수도 있습니다.

testValue = temp + 1;
testValue = 0;

"testValue = testValue ++" 코드를 저렇게 해석하는 것에 이견이 없을 거라고 봅니다. ^^

그렇다면, 출력된 IL 코드가 정말 이상한지 다시 한번 볼까요? IL 코드를 그대로 번역해 보면 다음과 같은 C# 코드로 변환이 가능합니다.

int testValue;  // 0번 로컬 변수
int temp;       // 1번 로컬 변수

// ldc.i4.0 
// stloc.0 
testValue = 0;

// ldloc.0 
// stloc.1
temp = testValue;

// ldloc.1
// ldc.i4.1 
// add
// stloc.0
testValue = temp + 1;

// ldloc.1 
// stloc.0
testValue = temp;

// ldloc.0
// call System.Console.WriteLine
Console.WriteLine(testValue);

어떠세요? 이젠 IL 코드가 그다지 비정상적이지 않다고 생각되시죠? ^^



그건 그렇고, IL 코드를 분석할 때의 팁이라고 하면... Debug 빌드의 산출물보다는 Release 빌드의 산출물이 더 다루기 편하다는 점입니다. 아무래도 최적화가 되어 불필요한 것들이 빠지게 되고, 실제로 현업에서 실행될 응용 프로그램의 빌드 버전이기 때문에 더 중요하기도 합니다.

질문자가 제시한 코드를 Release 빌드로 해보면 다음과 같은 코드가 나옵니다.

L_0000: ldc.i4.0 
L_0001: call void [mscorlib]System.Console::WriteLine(int32)
L_0006: ret 

결국, "testValue = testValue ++"는 "testValue = 0"과 별반 다를 바가 없는 코드인 것입니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 1/14/2017]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2017-01-13 06시20분
네...저도 질문받고 이상한 코드라고 생각은 했었는데 이런식으로 0으로 돌려놓는다는 게 저같은 쪼랩이 보기엔 어색한 방식이라...질문을 드렸었습니다.^^
testValue = testValue++; 코드 자체가 어색하긴 한데 원래의 질문자가 IL코드 해석을 부탁하니 그것부터 보다보니...음...제가 왜 성태님에게 이런 변명을...ㅋ
전체적인 설명을 해 주시니 너무 감사합니다~
Beren Ko
2017-01-14 05시52분
[spowner] 저도 감사드립니다
[guest]

... 181  182  183  184  [185]  186  187  188  189  190  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
339정성태9/14/200619294오류 유형: 11. ProtocolsSection?
338정성태2/4/200727535개발 환경 구성: 12. BUG: 웹 서비스에서 DataTable 사용하기 [2]파일 다운로드1
350정성태10/2/200620732    답변글 개발 환경 구성: 12.1. ASMX 2.0 and SchemaImporterExtensions파일 다운로드1
335정성태8/20/200628505디버깅 기술: 8. COM+ 서버 응용 프로그램에 대한 F5 디버깅 방법
334정성태8/20/200623724디버깅 기술: 7. VS.NET 2003/2005의 다중 프로젝트 디버깅
333정성태8/20/200624111개발 환경 구성: 11. COM+ 서버 활성화 보안 설정
331정성태8/27/200617125개발 환경 구성: 10. 최대 절전 모드와 VPC 네트워크 문제
330정성태8/20/200617422개발 환경 구성: 9. VPC로 구성하는 개인 환경
328정성태8/20/200635164개발 환경 구성: 8. AppVerifier 사용법 [1]
327정성태8/16/200631936개발 환경 구성: 7. ActiveX 서명 과정 자동화 [1]
326정성태8/16/200625689Team Foundation Server: 13. Sysnet 웹 사이트 TFS Migration
322정성태8/15/200620566개발 환경 구성: 6. 4GB 메모리 구성 [1]
316정성태9/20/200639677디버깅 기술: 6. .NET 예외 처리 정리 [6]
309정성태12/27/200640568디버깅 기술: 5. PDB 이야기 [7]
310정성태8/5/200627670    답변글 디버깅 기술: 5.1. PDB 파일에 따른 Debug 정보 - WinForm + Library 유형의 프로젝트파일 다운로드1
311정성태8/10/200627165    답변글 디버깅 기술: 5.2. PDB 파일에 따른 Debug 정보 - .NET 2.0 Web Application Project + Library 유형의 프로젝트
312정성태8/5/200629932    답변글 디버깅 기술: 5.3. PDB 파일에 따른 Debug 정보 - .NET 2.0 Web Site Model 유형의 프로젝트
313정성태8/12/200629059    답변글 디버깅 기술: 5.4. VS.NET 2005 디버그 모드에서의 PDB 파일 사용 차이 (1)
317정성태8/12/200626518    답변글 디버깅 기술: 5.5. VS.NET 2005 디버그 모드에서의 PDB 파일 사용 차이 (2)
318정성태8/12/200632957    답변글 디버깅 기술: 5.6. VS.NET 2005를 이용한 미니덤프 파일 분석 (1)
319정성태8/12/200627980    답변글 디버깅 기술: 5.7. VS.NET 2005를 이용한 미니덤프 파일 분석 (2) [1]
320정성태8/12/200632095    답변글 디버깅 기술: 5.8. WinDBG를 이용한 미니덤프 파일 분석 [1]
321정성태8/13/200636530    답변글 디버깅 기술: 5.9. Microsoft의 PDB 파일 관리
323정성태8/15/200637851    답변글 디버깅 기술: 5.10. Symbol Server 생성 [4]
324정성태8/15/200634725    답변글 디버깅 기술: 5.11. PDB 파일과 소스 코드
325정성태9/8/200627443    답변글 디버깅 기술: 5.12. CCP를 이용한 Windows Source Code 수준의 디버깅
... 181  182  183  184  [185]  186  187  188  189  190  191  192  193  194  195  ...