인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

신우석님의 프로필 이미지
신우석

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

반복문

마지막 예제에 대해 질문드립니다.

작성

·

261

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
 
마지막 예제의 29분 40초 경
bool isEven = ((count % 2) == 0); 이라는 라인을 입력하게 되는데,
이렇게 되면 루프가 돌 때마다 변수의 값을 변경하는게 아닌,
isEven이라는 변수를 매번 선언하게 되는 것처럼 보입니다.
이 경우 별다른 문제는 없는 것인가요?
 
추가로 질문이 더 있는데, 이 부분을 디스어셈블리로 봤을 경우
마치 분기문처럼 어셈블리어가 이루어져 있더라구요. 이 부분은 ((count % 2) == 0)처럼 비교를 하는 부분이 있기 때문에 이해가 가는데,
중간에 dec와 or, inc가 나오는 라인은 왜 그런 것인지 이해가 되지 않습니다.
나머지를 구하는 연산의 경우 div 명령어를 사용하여 dx 레지스터에 저장된 나머지값을 가져오면 되는 것으로 이해하고 있습니다. 그렇게 하지 않는 것은 해당 컴파일러의 특성처럼 이해해도 될 것 같은데, 그것 외에 그냥 해당 instruction 자체가 이해가 가지 않아서, 이해를 돕고자 질문드립니다.
해당 어셈블리 부분 첨부합니다.
 
bool isEven = ((count % 2) == 0);
006924D0mov eax,dword ptr [ebp-44h]
006924D3 and eax,80000001h
006924D8 jns std::_Narrow_char_traits<char,int>::length+0Fh (06924DFh)
006924DA dec eax
006924DB or eax,0FFFFFFFEh
006924DE inc eax
006924DF test eax,eax
006924E1 jne std::_Narrow_char_traits<char,int>::length+1Fh (06924EFh)
006924E3 mov dword ptr [ebp-118h],1
006924ED jmp std::_Narrow_char_traits<char,int>::length+29h (06924F9h)
006924EF mov dword ptr [ebp-118h],0
006924F9 mov cl,byte ptr [ebp-118h]
006924FF mov byte ptr [ebp-4Dh],cl

답변 1

0

Rookiss님의 프로필 이미지
Rookiss
지식공유자

bool isEven = ((count % 2) == 0); 이라는 라인을 입력하게 되는데,
이렇게 되면 루프가 돌 때마다 변수의 값을 변경하는게 아닌,
isEven이라는 변수를 매번 선언하게 되는 것처럼 보입니다.

이 경우 별다른 문제는 없는 것인가요?

네 상관없습니다.
생성자가 있는 class 타입이라면 기본 생성자가 루프마다 호출되니 동작이 다를 수 있지만,
bool의 경우 bool isEven으로 밖으로 빼도 동일하게 코드가 만들어집니다.

그리고  cout 등을 사용하면 어셈이 굉장히 복잡해지고

경우에 따라 잘못 표기되는 경우도 있으니 해당 부분을 빼고 다시 테스트 해보세요.

신우석님의 프로필 이미지
신우석

작성한 질문수

질문하기