초보 코린이의 성장 일지

C 정리 본문

개인 공부

C 정리

코오린이 2023. 1. 19. 00:35

컴파일 순서 

전처리기(.h) -> 컴파일(.cpp) 결과로 오브젝트 파일 생성 ->  링커 lnk파일 -> obj 합처져서 -> exe 파일

-> 컴퓨터 구조 ssd에 저장

 

지역변수 : Stack 영역

 

전역변수 : Data 영역

 

동적변수 : Heap 영역

 

메모리 구조, 지역변수 - 스택, 동적할당 변수 - 힙에 각각 할당하는 이유

Stack 영역 : 지역변수가 저장하는 이유, 스택은 함수가 호출될때 스택프레임이 만들어지는데 1메가(1023 byte)정도를 가지고있다

데이터를 쌓아가는 구조

함수가 호출될때 처음에 처음 호출된 곳 주소를 넣고 넘길 파라미터를 넣고 넘어갈 주소를 넣는다. 함수호출이 되면 넘어갈 주소를 꺼낸다. 안쪽에 함수들 안에있는 지역변수들을 다시 담고 연산이 끝나면 소멸을 시작해야 하므로 다 꺼내서 소멸 시키고 돌아갈 주소를 꺼내서 턴한다. 턴할때 return값이 있으면 넣어서 턴하게된다. 콜을 당한쪽이 아닌 호출한쪽에 정의한다.

작은 공간이고 넣은 순서에 역순으로 다시 나온다.

재귀함수를 생각하면 계속 쌓이고 쌓이는 느낌

임의로 변수를 제어 할수가 없다. 지역변수를 임의로 소멸시킬수가 없다 그 이유는 Stack에 들어있기 때문

지우려면 모든걸 다 꺼내서 지워야한다. 

 

Heap 영역 : 가변공간 Heap라 생각하면된다 vector같은 존재 실제로 이안에 힙은 안에 구조가 일차원 배열로 되어있다

메모리가 필요하면 늘려가고 없으면 지워간다(아래로 내려가는 구조). 리눅스나 유닉스는 뒤집어져서 밑에서부터 올라오는 구조, 동적할당을 하게되면 밑으로 계속 내려오는데 중간에 삭제하게되면 그 공간은 비워놓고 지워버린다. 그리고 계속 밑으로 내려오다가 메모리가 필요하다고 판단하면 위에서 부터 찾아서 할당한다. 그래서 가변배열로 늘려놓은거다.

 

static(지역, 멤버) : 지역변수일때랑 맴버변수 일때랑 동작은 똑같고 소멸되지 않는다.

할당 소멸은 지역변수는 그 함수가 호출되서 만나야 할당되고, 객체면 프로그램 시작할때 할당된다.

둘다 프로그램이 소멸되서 영역이 파괴될때 일어난다.

 

extern : 한 헤더에 다른 cpp에서 변수를 공유해야한다면 하나의 cpp에 extern에 선언 후 사용하는 곳에서도 extern해줘야 공유가 가능

 

Call By Value / Address / Reference : 주소, 참조

 

auto : 멀티 컴파일 하는 상황일때 auto는 자료형이 확정되야 변환을 하는데 a class에서 auto를 사용했는데 b class에서 컴파일이 끝난게 아니라면 자료형이 확정이 안됐으므로 사용하면 안됨

 

상수(const)

포인터 : const int - 값 변경불가  , int const - 주소 변경불가 

레퍼런스: 주소를 동일하게 사용하므로 값 참조만 막는다.

멤버: 함수내에서는 맴버값 변경 불가능, return 전용 함수, 값이 변경되면 안되는 함수들

 

매크로

변수의 문제점 : 자료형 확정이 안되있다는게 문제 float 숫자를 사용할때 소수점이 짤릴수도 있다

매크로 사용해서 7 * 9 식을 썼다면 코드 치환이 일어나면서  3 + 4 * 4 + 5로 연산자 순서가 이렇게 흘러가버린다.

우선순위를 꼭 지켜야 하므로 매크로를 사용하게 되면 정확하게 괄호로 구분해줘야한다.

 

구조체

패딩 : 

공용체 : 같은 메모리 공간을 다른 이름으로 묶어서 사용하기 위한 것 

 

동적할당

malloc, free : 

new, delete : 

virtualalloc - virtualfree : Ram이 꽉차버리면 다른것을 가져와 사용 할 수가 없다 그래서 가상 메모리를 (RAM처럼)사용한다. 변수를 읽을때 캐시를 확인 없으면 -> RAM으로 내려와서 확인 없으면 -> 가상 메모리 확인 한번 찾게되면 CPU가 캐시 기억장치에 올려놓는다. SSD의 일부공간을 RAM처럼 사용하는 방법이다.

특징 하나 더 new는 사용하는 순간 메모리 할당이 되지만 virtualalloc는 예약으로 할당을 할 수 있다.

 

함수 호출 규약

스택 프레임 - 메모리 오버플로우 : 스택이 힙영역을 침범했을 때, 스택 프레임에 범위를 벗어나는 순간 오버플로우 발생, 범위가 약 1mb 정도 크기를 가진다.

EBP(Basic Point), ESP(Stack Point) : EBP 스택프레임이 만들어 졌을때 기준 주소, 호출 됐을때 기준주소 Stack이 계속 쌓이면서 ESP가 올라가는데 Stack이 정리되면서 내려오면 EBP와 ESP가 정리가 끝이나면 Stack 프레임이 파괴가 되는 순간이다.

cdecl, stdcall, thiscall,, fastcall :

가변 파라미터 함수 구현 방법 : 위에꺼 찾아보기

 

컴파일러

컴파일 과정 :

컴파일러와 인터프리터 차이 : 컴파일러는 전체를 번역해서 한번에 실행한다면, 인터프리터는 한줄 한줄 번역하고 실행한다. 속도는 컴파일러가 빠를지 몰라도 유연성은 인터프리터가 좋다.

C#과 C++의 차이 : 차이 찾아서 정리

게임 프로그래밍에서 C++ 사용 이유 : 차이 찾아서 정리

 

cpu안에 디코더가 안에 있는데 명령어 해석기 역할을 한다. 하나의 명령어를 해석할 수 있으면 저급언어고 그게 아니라면 고급언어이다. 기존 c에서는 추상화가 적용되지 않아서 c++에서 사용할 수 있는 기능(문법)들을 사용 할 수가 없다.

c++는 추상화가 되어 있기 때문에 고급언어에 해당한다.

추상화가 적용됐다는 것은  디코더에 명령어가 하나가 아닌 여러개가 들어가 있을때 컴파일러 저 문법을 보고 디코더에 맞도록 내부적으로 변환을 해준다. 

컴파일러가 명령을 디코더가 이해할 수 있도록 자동으로 한줄 한줄 변역을 해놓고 매칭을 시켜놓으면 고급

안하고 디코더에 바로 들어가게끔 하면은 저급언어

 

정수, 실수

Float형의 오차 발생 이유와 범위 : 부동소수점 범위 때문에 오차가 발생 그래서 정확하지 않다. 수치의 변동이 조금이라도 일어나는 작업이라면 float 쓰면 안된다. 게임에서는 정밀도가 높지 않아 상관이 없다.

Int, Float의 값 문자열로 변경 : byte연산을 해야한다 찾아서 정리해야한다.

부동 소수점 수의 장/단점 : 

 

포인터

허상 포인터 - 발생 이유 : 참조된 주소가 지워졌거나, 상 캐스팅 실패했을때, 다이나믹 캐스팅 실패했을떄 Null이 아니라 허상포인터 왜 자식 영역에 다시 캐스팅됐는데 자식영역에 있어야 하는게 없어서 발생

함수 포인터 :

 

'개인 공부' 카테고리의 다른 글

가상 메모리  (0) 2023.03.04
IDE (통합 개발 환경 - Integrated Development Environment)  (0) 2023.02.23
OBB 분리축  (0) 2023.01.06
C++ AMP (Accelerated Massive Parallelism)  (0) 2023.01.04
퀵소트 (Quick Sort)  (0) 2023.01.03
Comments