본문 바로가기

분류 전체보기

(308)
[C++] 초기화 리스트는 선처리 영역에서 실행된다. C++에서 초기화 리스트를 사용하는 이유가 단순히 가독성 때문인가라고 생각했었는데, 그게 아니였다. 초기화 리스트는 선처리 영역에서 실행된다. 이 말의 의미에 대해 알아보자. Child 클래스는 Parent 클래스를 상속받는 자식 클래스라고 하자. 그러면 Child 클래스는 본인의 생성자를 호출하기 전에 Parent 클래스의 생성자를 호출하는데 그게 어디일까? Child() //
[C++] 포인터 vs 배열 문자열은 포인터와 배열, 두가지로 표현할 수 있다. const char* test1 = "Hello World" char test2[] = "Hello World" 둘의 결정적인 차이점은 test1은 문자열이 시작하는 주소를 가리키는 포인터이고 배열명 test2는 문자열이 시작하는 주소 자체이다. 그래서 test1은 자신의 주소를 따로 가진다. 그래서 &test1은 문자열이 시작하는 주소가 아닌 전혀 다른 위치를 가리킨다.
[C++] 포인터 vs 참조(레퍼런스) 포인터와 참조는 로우레벨 개념까지 봤을 때 원리는 동일하다. 그렇기 때문에 속도도 같다. 그렇다면 어떤 것을 이용하는게 좋을까? 먼저 포인터와 참조의 가장 큰 차이점은 nullptr이다. 포인터는 nullptr을 가질 수 있지만 참조는 어떤 변수의 별명이기 때문에 반드시 무언가를 가리켜야 한다. 그래서 nullptr값을 가질 수 있다면 포인터, 아니라면 참조를 사용하는 것이 좋을 것이다. 참조를 사용하는 이유는 일단 편해서이다. 포인터는 ->로 접근해야 하는데 참조는 . 로 일반적인 방법으로 접근이 가능하다. 그렇지만 이 편한 것이 장점만 있는 것은 아니다. . 으로 접근하기 때문에 레퍼런스인지 일반 데이터인지 헷갈릴 수 있다. 그래서 사용하는 것이 #define OUT으로 의미없는 문자열을 만들어서 참..
[C++] 정수형, 불리언, 부동소수점 정수형 정수형은 가장 기본이 되는 데이터 타입으로 int 뿐만 아니라 , boolean , float 들도 정수형으로 이루어져있다. 위처럼 char도 문자를 담는다고 알고 있지만 1바이트 크기의 정수형 데이터 타입이다. 여기에 unsigned를 붙이면 최상위 비트가 1이더라도 항상 양수로 계산하기 때문에 두배만큼 양수쪽으로 범위가 커진다. 불리언 불리언은 c++에서 bool 변수이름 = true or false로 표현하는데 1바이트의 정수형이다. 그런데 이 사람이 플레이어인지 int IsPlayer = 1 or 0 으로 표현하기에는 이게 플레이어의 개수인지 헷갈린다. 그래서 가독성의 문제때문에 만들어졌다. 그렇다면 0과 1만 쓰니까 1비트만 써도 되지 않을까?라는 의문이 생기지만 보통 프로그램에서 사용하..
[어셈블리] 스택 메모리 스택은 함수가 사용하는 메모장으로 매개변수 전달과 돌아갈 주소 관리를 한다. 위 이미지처럼 스택은 높은 주소부터 시작해서 쌓여나가며 함수가 실행될 때 마다 지역 변수, 반환 주소값 매개변수가 스택에 쌓인다. 그리고 함수가 종료될 때 스택에서 소멸한다. 레지스터는 다양한 용도로 사용되는데 a b c d 같은 범용 레지스터 말고도 위치를 가리키는 포인터 레지스터가 있다. ip (instruction pointer) : 다음 수행 명령어의 위치 sp (stack pointer) : 현재 스택 top 위치 bp (base pointer) : 스택 상대 주소 계산용 그리고 위 삼총사들을 알아놔야 한다. 함수호출 전에 매개변수들을 push하고 call 함수로 호출하면 함수가 끝나고 다음에 실행해야 할 주소(반환 주..
[어셈블리] 배열 어셈블리에서 배열은 위와 같이 표현할 수 있다. a배열은 1~5까지 배열이고 b의 times는 같은 데이터를 반복할 때 사용한다. b는 초기값이 1인 dword 크기의 요소를 5개 가진 배열이다. 그렇다면 a배열의 각 요소들에 접근을 어떻게 할까? a자체는 배열의 주소를 나타내므로 [a]로 배열 자체를 가져온다. 그렇게 1바이트를 출력하면 맨 앞 1이 출력된다. 그리고 그 이후 배열의 요소도 인접해있으므로 [a+1]로 두번째, [a+2]로 세번째.. 이렇게 요소들을 출력할 수 있다.
[어셈블리] 반복문 위는 Hello World를 10번 반복해서 출력하는 반복문이다. 반복문이지만 사실상 이전 분기문과 다름없다. msg 변수를 출력하면서 ecx를 초기에 10으로 설정하고 (사진에서 짤림) 1씩 ecx를 감소시킨다. 그리고 0과 비교해서 0이 아니라면 다시 LABEL_LOOP를 돌린다. 따로 반복문을 위한 문법도 있다. loop를 사용하면 자동으로 루프마다 ecx를 1씩 줄여나가면서 반복실행한다. 위 코드는 1부터 100까지 합을 구하는 코드이며 xor ebx, ebx는 mov ebx, 0 과 같은 의미이다. (자기자신과 xor하면 0이 나오는 것을 활용)
[어셈블리] 분기문 조건문 CMP dst, src (dst가 기준) destination과 source를 compare 비교를 한 결과물은 Flag Register에 저장 JMP [label] 시리즈 JMP: 무조건 점프 JE: JumpEquals 같으면 점프 JNE: JumpNotEquals 다르면 점프 JG(JumpGreater), JGE(JumpGreaterEquals), JL(JumpLess) 등등... 간단한 예제인데 rax, rbx에 데이터를 저장하고 두 값이 같으면 LABEL_EQUAL로 점프해 rcx를 1을 저장하고 같지 않더라도 무조건 LABEL_EQUAL_END로 점프한다. 왜냐하면 LABEL들도 순차적으로 실행되기 때문에 rax, rbx가 같지 않으면 rcx를 초기값 0으로 그대로 두게 하기 위함이다. ..