inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

const와 메모리 구조

조사식 관련

해결된 질문

592

한울

작성한 질문수 36

0

64비트 운영체제 환경에서는 모든 기본 단위나 주소 체계 등이 64비트라고 하셨었는데 

조사식에서 esp는 출력이 되지만 rsp의 경우에는

'식별자 "rsp"이(가) 정의되어있지 않습니다' 라고 나오는데 왜 그런 것인지 궁금합니다..   

그리고 조사식에 esp를 입력했을 때 형식은 unsigned int로 동일하게 나오지만 값이 강의와는 다르게 16진수가 아닌 10진수로 출력되는데 바꿀 수 있는 방법이 있을지도 알고 싶습니다(&c 등은 16진수로 출력됩니다) 

C++

답변 1

0

Rookiss

강의에서는 x86으로 실행하고 이 의미는 32비트 프로그램입니다.
x64로 하셔야 64비트 프로그램으로 실행됩니다.

숫자를 바꾸려면 값을 우클릭해서 [16진수 표시]를 누르시면 됩니다.

0

한울

아하 간단한 이유였군요...ㅠㅠㅠ

답변 감사합니다!

0

한울

그리고 1가지 더 궁금한 것이 있습니다

const int 변수(함수 바깥에 있는)가 메모리 할당을 받지 않았는데도 사용 가능한 이유가 디스어셈블리에서 mov dword ptr [c],3을 통해 컴파일러가 모든 값들을 3으로 바꿔치기 해서 그렇다고 하셨는데 

해당 어셈블리어는 c에 3을 저장한다로 의미가 되는 것으로 이해가 되는데 왜 const int 변수가 바꿔치기가 되는지, 그리고 만약 된다면 다른 변수들을 0,1,2로 바꿔치기 해주는 어셈블리어는 없는 것인지 궁금합니다...

0

Rookiss

어떻게 구현이 되어야한다는 제약사항이
있는건 아니라 그건 컴파일러 마음입니다.
3만 되는 그런건 아니고 가능하면 최적화 된 코드로 만들어주려는 것이죠.

0

한울

컴파일러가 마음대로 한다고는 해도 어쨋거나 const 변수들을 어떻게 마음대로 처리할 것인지는 어셈블리어로 표현이 나올 줄 알았는데 이것 외 해당될만한 다른 어셈블리어를 못 찾겠습니다...ㅠㅠㅠ

0

Rookiss

질문이 잘 이해가 안가는데요.
컴파일러 최적화가 나온건 별도의 변수 (const 변수)를 메모리에 만들고
그걸 이동시켜서 dword ptr[c]에 넣는게 아니라,
바로 mov dword ptr [c], 3을 넣을 수 있는 부분을 최적화라  한겁니다.
즉 어셈 단계로 까보면 사실 const 변수는 존재도 안하는 셈이죠.

그리고 이 정도로 처음부터 정밀하게 깊게 들어갈 필요는 없고
디테일 한 부분이 궁금하시다면 어느 정도 컴퓨터 구조와 운영체제에 대한
이해도가 생긴 후에 연구하심을 권장 드립니다.

0

Rookiss

const는 C, C++에나 있는 개념이지 어셈에선 [값이 바뀌지 않는 변수]가 존재하지 않습니다.
그러니 어셈 문법에 맞게 알아서 교체를 하는거고
그게 상수가 될 수도, readonly data가 될 수도 있습니다.
그 이상은 신경쓸 필요 없고 어떤 영역에 저장되었는지를 구분할 이유가 없습니다.

0

한울

고민할수록 머릿속이 점점 꼬이는 느낌이었는데 이제 이해가 확실히 된 것 같습니다 정말 감사합니다!

0

한울

안녕하세요

다름이 아니라, 열거형 강의를 들으면서 const에 대해 궁금한 것이 1가지 더 생겼습니다...;;

auto a = &SCISSORS;와 같은 것 없이

int b = 1;

int c = 2; 을 main 함수 내에 작성하니

mov dword ptr[b],1

mov dword ptr[c],2가 나왔고 여기까지는 이해를 했습니다

 

그런데

auto a = &SCISSORS;를 해서 SCISSORS가 메모리영역에 저장되게 한 뒤에

int b = 1;이라고 main 함수 내에 작성하면

mov dword ptr[b],1 대신

add byte ptr [eax], al

add bh, al 이라고 나오는데 

이 어셈블리어가 변수를 메모리에 만들고 이동시켜서 dword ptr [b]에 넣는 것인가요?

그리고 따로 &ROCK 관련 코드를 작성하지 않았던 c도

inc         ebp  

fadd        qword ptr [edx]  

add         byte ptr [eax],al  

add         bh,al

로 나오는데  

int c = 2;의 어셈블리어가 왜 mov dword ptr[c],2로 나오지 않는 건지 궁금합니다

 

감사합니다!

0

Rookiss

컴파일러는 C++ 코드를 어셈으로 변환하는 것이 목적이고
C++ 문법과 어셈 문법은 다르기에
컴파일러가 나름의 최선의 방법을 선택하게 짜여져 있을 뿐,
100% 동일하게 꼭 이렇게 해야 한다는 규칙은 없습니다.
const 변수가 단순하게 쓰여지면 그냥 1,2,3 숫자로 하드코딩하는게 낫다고 판단할 수도 있고
특이하게 &를 이용해 const 변수 주소를 사용한다면,
어찌됐건 해당 변수를 만들어야 주소를 추출할 수 있으니  변수로 만들 수도 있겠죠.

0

한울

그럼 이 경우는 컴파일러가

'const SCISSOR의 주소가 필요하네? 얘는 상수로 바꿔치기 하면 안되겠다 + 다른 const ROCK, PAPER들은 주소가 필요없지만 얘네도 변수로 만드는 게 최선인 거 같으니 상수로 바꿔치지 말자' 이렇게 판단한 거라고 이해하면 맞을까요?

그리고 int b = 1;과 int c = 2; 부분에 있는 어셈블리어의 의미가 어떻게 되는지 간략하게나마 설명해주실 수 있을까요?

visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.

0

559

1

정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?

0

453

1

strcpy() 구현 관련 질문

0

533

1

빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?

0

475

1

클래스 타입의 포인터 질문합니다

0

559

1

입력값을 enum 값에 넣어주는거 이제 막혔나요?

0

503

1

템플릿 특수화 관련 질문

0

389

1

포인터 관련 질문합니다!

0

270

1

Unable to start assembler. Check your settings.

0

848

2

cpu선택

0

548

1

포인터 질문이 있습니다

0

331

1

20:35 에서 구조체 크기에 대한 질문입니다!

0

589

1

iterator 삭제관련

0

415

1

함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!

0

316

1

15 분 45초 대 질문

0

317

0

스택 프레임 질문합니다!

2

312

1

오른값 참조 in 게임

0

391

0

동적할당 질문이 있습니다

0

457

1

안녕하세요 메모리에 대해 질문드립니다.

0

312

1

함수객체 의 매개변수

0

365

1

복사생성자

0

439

1

main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요

0

430

1

포인터 실습 강의를 보고 궁금한게 있습니다.

0

359

1

스택 오버플로우

2

801

1