기본 콘텐츠로 건너뛰기

C언어 register 변수의 함정카드


C언어를 하다보면 register 라는 CPU의 레지스터에 자료를 저장하는 변수를 알수있다.
대신에 한 프로그램에서 최대 2개 정도까지만 사용이 가능하고 지역변수만 가능 및 32bit CPU는 32bit 크기의 변수만 사용 가능하다.

장점만 보면 기본적으로 메모리쪽에 저장되는 일반 변수들보다 더 빠르게 접근이 가능할 것 같은데...인라인 어셈이랑 메모리랑 레지스터랑 비교하면 어떤게 가장 빠른지 궁금해서 한번 테스트 해보게 되었다.

우선 테스트 해볼 코드는 다음과 같다.

거의 동일한 연산을 하고 다른 점이 있다면 인라인 어셈은 전부 다 레지스터를 이용해서 연산한다는 정도...?

위의 코드를 컴파일 해서 실제로 돌려보면 실행 결과는 다음과 같이 나온다.

!?
그냥 아무런 형식도 지정해주지 않은 auto와 똑같은 결과가 나온다.
# C언어는 기본적으로 아무런 형식을 지정해주지 않으면 auto로 해준다.
# int a => auto int a

그래서 어째서 저런 결과가 나왔는지 컴파일에 옵션을 줘서 어셈파일을 분석해 보았다.


인라인 어셈 auto for
register for
push ebp
mov ebp, esp
mov ecx, 0
jmp SHORT $INLoop$3

$INLoop$3:
cmp ecx, 10000000
jae SHORT $EXIT$4
mov eax, ecx
shl eax, 2
inc ecx
jmp SHORT $INLoop$3

$EXIT$4:
cmp ebp, esp
call __RTC_CheckEsp
popebp
ret,0
push ebp
mov ebp, esp
sub esp, 8
mov DWORD PTR [ebp-8], -858993460
mov DWORD PTR [ebp-4], -858993460
mov DWORD PTR _i$2[ebp], 0
jmp SHORT $LN4@For

$LN2@For:
mov eax, DWORD PTR _i$2[ebp]
add eax, 1
mov DWORD PTR _i$2[ebp], eax

$LN4@For:
cmp DWORD PTR _i$2[ebp], 10000000
jae SHORT $LN1@For
mov ecx, DWORD PTR _i$2[ebp]
shl ecx, 2
mov DWORD PTR _a$1[ebp], ecx
jmp SHORT $LN2@For

$LN1@For:
mov esp, ebp
pop ebp
ret 0
push ebp
mov ebp, esp
sub esp, 8
mov DWORD PTR [ebp-8], -858993460
mov DWORD PTR [ebp-4], -858993460
mov DWORD PTR _i$2[ebp], 0
jmp SHORT $LN4@registeFor

$LN2@registeFor:
mov eax, DWORD PTR _i$2[ebp]
add eax, 1,
mov DWORD PTR _i$2[ebp], eax

$LN4@registeFor:
cmp DWORD PTR _i$2[ebp], 10000000
jae SHORT $LN1@registeFor
mov ecx, DWORD PTR _i$2[ebp]
shl ecx, 2
mov DWORD PTR _a$1[ebp], ecx
jmp SHORT $LN2@registeFor

$LN1@registeFor:
mov esp, ebp
pop ebp
ret 0

함수부분만 잘라서 보면 위와 같은 어셈코드로 변환됐는데, 기본값이랑 register로 한 코드가 차이가 없다. 그리고 register을 적용을 하엿음에도 불구하고 어셈 코드를 보면 메모리를 사용한다. 이게 어찌된 일인걸까?
혹시 64bit가 아니여서 그런가 해서 컴파일을 x64로 바꾸고 long, long long으로도 해보앗지만 동일한 결과가 나왔다.

컴파일러의 문제인지...문제점이 어떤 것인지는 모르지만 적어도 내가 쓰는 Visual studio 2015에서는 저런 결과가 나온다...

얻은 결론)

  • VS 2015에서는 register로 선언해도 실제로는 선언이 않된다.
  • 어려운 작업이 아니고, 굳이 빨리 처리해야된다면 인라인 어셈을 쓰자


Ps. 만약 저랑 같은 VS2015에서 되는분이 있으면 좀 알려주세요... 저만 그런지 궁금하네요;

댓글

이 블로그의 인기 게시물

싱가포르 여행 1일차

난분명 아침에 11시쯤에 바로 밥먹고 공항으로 이동한다는 소리를 들었는데...그전에 과학관으로 끌려가서 급하게 회로 만들어서 전시를 하게 됬다... 다른 학교에서 준비한 회로 급하게 준비한 회로 아쉬운게 이거 기간만 제대로 알앗더라면 좀더 멋들여 지게 만들수 있엇을것 같다... 아무튼다시 과학관에서 학교로 이동한뒤 바로 공항으로 끌려 나가게 되었다.  공항 도착!!!  오오오, 처음와보는 인천 공항...예상이상으로 크고 넓엇다. 예전에 가족여행을 가면서 청주공항은 갓지만 여긴 그 청주공항보다 더 크고 넓다는 느낌이 들었다. 그리고 너무 일찍와서 애들 사진찍고 시간만 때웟다.  비행기 타기전 시간을 계속 때우다가 비행기를 보게 됫는데 멀리서 보니까 은근 작다는 느낌...? 그리고 가까이서 보니 크더라...  비행기 안   운이 좋게도 창문쪽으로 자리가 됬다 어예  비행중  비행 시간이 총 6시간 걸린다고하길레 심심할줄 알았는데 예상외로 노래도 있을건 있고 (없을건 없다) 영화도 않본것들이 들어있어서 그래도 심심하지 않게 온것 같다. 그리고 3번째 사진이 기내식인데 이거 다른거 다 괜찮은데 두부가 왜 들어 있는건지 정말 맛이 없다... (개인적으로...)  도착 일단 도착해서 짐을 찾은 뒤, 유심을 사기위해서 이동을 했다.  유심 구입 10 일동안 100GB에 국제 전화 90분 무료라는데...싱가포르 달러기준으로 30$를 내고 구입했다. 사실상 이거 로밍보다 가성비가 좋은것 같다. 그리고 이거 제일 신기했던게...일반 유심이랑 나노랑 마이크로랑 3단 분리가 된다고 표현해야되나....아무튼 3종류 유심사이즈들을 다 커버해준다...그리고 그다음 버스를타고 숙소로 이동하기 위해서 공항 밖으로 나왔는데 ...

마소 후기

원래 한 5명? 정도가 가기로 했는데 이 석ㅇ... 암튼 애들이 다 숙제나 다른 애는 광주로 간다고 해서 결국 혼자 다녀왔다.... (도착) (사실상 경치 감상하기 좋은 곳) 앞에 광화문에서 어떤 행사인지는 모르지만 행사를 해서 위에서 지켜다 보면서 기다리다가 입장을 하게 되었다. (입장) 이번에는 저번 구글 IO 때처럼 대충 듣고 가기 싫어서 앞자리를 차지했다. 기억에 남는 내용 몇 가지를 뽑자면  일단 첫 번째로 왼쪽은 Visual Studio 내장 에뮬로 구동을 한 설정 이고, 오른쪽은 그냥 윈도우 10에 내장된 설정 창이다. 대충 보면 많이 다른 것처럼 느껴지지만 ... 이 두 가지 방법을 이용하여 두 설정을 동시에 만들어 낼 수가 있다. 사이즈에 따라 속의 UI 가 바뀌어 진다는 것이 마치 반응형 웹 페이지를 보는 기분... 두 번째로 기억에 남는 내용은 컴파일 바인딩에 관련된 것이다. (왼쪽 : 동적 데이터 바인딩, 오른쪽 : 컴파일 바인딩) 두 가지 바인딩 식이 있는데 하나는 컴파일 바인딩 하나는 동적 데이터 바인딩 동적 데이터 바인딩은 DataContext 설정이 필요하다. 컴파일 바인딩은 바인딩 성능 향상 과 기존의 편리함을 유지하고 런타임 시 부하가 적고 리플렉션 코드가 최소화 된다. 그리고 변환된 코드는 무려 디버깅이 가능하다! 하지만 대상 타입의 명시적인 선언이 필요하고 해당 페이지의 멤버만 바인딩이 가능하다는 단점(?)이 있다. 그리고, 세 번째로 기억에 남는 부분은 Windows 10 IoT 에디션 인데.... 데스크탑 API의 54%공유 (나머지는 모바일 전용 셀롤러 데이터 등) 모바일의 84% (센서 부분을 위한 API) 최소사양이 램 256MB... 하나의 UI...

싱가포르 여행 2일차

 아침  진짜 한마디로 요약하자면 제일 맛있는게 사진 오른쪽에 오렌지 주스다. 어제 기대한 것 처럼 뷔폐식으로 나오긴 했는데 한국에서 먹던것과는 맛이 매우 큰차이가난다. 사진에는 없지만 밥이 우리나라처럼 서로 좀 달라붙는 그런 밥이아니라 그냥 흐트러지는 점성이 없는 밥이다... 그리고 가장 충격이였던게 시리얼 맛이 진짜 우리나라꺼만 먹다가 가면 이게 먹으라는건지 아니면 내가 잘못가져온 건가 라는 생각이 들 정도로 맛이 없다. 그냥 콘 시리얼이라 그런거 같긴 한데...뭔가 맛이 이상한 우유랑 섞이니 맛이 아주 개판이다. (한국꺼만 먹다간 내 기준)  시스코(CISCO) 견학  원래 내이름은 KIM GYUNG SIK인데...같은 발음인 저렇게 됫다 (여권도 저래됨)  역시 네트워크 관련 기업이라서 그런지 서버실은 기본이요 네트워크를 활용한 여러가지 기술들을 볼수 있엇다.그리고 외국 기업이라 그런지 내부 지원(?) 이 상당히 좋다...노는곳도잇고 낮잠을 잘수 있는곳까지 존재한다.  점심  솔직히 말해서 이메뉴 샤브샤브같은 거라던데...뭔가 우리나라의 샤브샤브랑은 너무 많은 차이가 있던 메뉴였다...소세지도 들어가고 닭고기도 들어가고 생선도 들어가고....  동물원  동 물원에 도착해서 들어가면 맨 처음으로 펭귄이 있는데 얘내가 너무 귀여웠다. 그리고 그다음으로는 5번째 사진의 이동수단을 이용해서 관람을 진행하는데 한국에서는 보지 못했던 여러가지 종류의 새를 볼수 있엇다. 마지막으로 여기서 공연을하는데 새를 이용하고 관객들이 참여할수 있단점에서 인상깊엇던 공연이였다  (한국에서는 본적이 없다...)  싱가포르 대학교   여긴 아쉽게도 찍은 사진이 한장밖에 없다. (한장 더있지만 팀 사진이라서 일단 보류) ...