면접 대비용으로 정리한 글 매우 두서 없이 보일 수 있음. 1. 락스텝이란? : 군인들이 발맞춰 걸어가는 것. 신호에 맞춰서 똑같이 행동하는 것. 2. 구동 원리는 무엇인가? : 하나의 플레이어가, 신호를 주면 모든 클라이언트가 동시에 update : 이것을 함으로써 한 공간(씬)에 있는 플레이어들이 입력 신호만 주고 받음. : 명령( 이동을 어디로 해라) , 시간( 언제 화면에 뿌려라) , 체크섬(게임 상태에 대한 해킹 방지용)을 보냄 * 시간에 대한 공식 - 현재시간 + RTT(왕복레이턴시) /2 + 상수(이걸로 조정, 너무 커도 , 작아도 안됨) 3. 장점 : 한 씬에 있는 많은 캐릭터가 적은 통신량으로 정확하게 동기화가 되어 보이게 가능 4. 단점 : 게임 중간에 들어오는 것에 대한 구현이 어려움..
1. 윈도우는 유니코드 문자를 UTF-16로 인코딩 : 각 문자를 2바이트(16비트)로 구성함. : 몇몇 소수 언어들은 2바이트도 부족한 경우가 존재. 그래서 4바이트 인코딩 방법도 존재는 함 2. 유니코드 문자열 선언 :wchar_t name = L'Ronaldo'; :wchar_t dataBuf[100] = L"Cristiano Ronaldo"; //99개의 16비트 문자와 16비트 문자열 종결 문자 0 : 윈도우를 개발한 팀에서 c언어의 자료형과 윈도우 자료형을 구분하기 위해 WinNT.h에 아래와 같이 정의해둠 typedef char CHAR; // 8비트 문자 typedef wchar_t WCHAR // 16비트 문자 : 또한 문자와 문자열을 가리키는 포인터 자료형에 대해서도 아래와 같이 정의함..
면접 준비용으로 정리하는 것. 글이 다소 두서 없을 수 있음. 나편하게 읽으려고 쓰는 것임. 1. 구조체와 클래스의 통일성 있는 초기화 방법 : ex) struct Ronaldo 라는 구조체와 class Messi 라는 클래스가 있다고 가정 : 초기화는 Ronaldo = {1,2,3}; Messi = {1,2,3}; 이런식으로 동일하게 이용할 수 있다. : 구조체나 클래스 외에도 변수도 저런식으로 초기화가 가능하다.(굳이 쓸일은 없을거 같다만..) : 0으로 초기화할 경우 {} 뭐 이런식으로 말이다. : 클래스 내에서 생성자 초기화 리스트에서도 멤버 변수인 배열을 초기화 할 때 사용할 수도 있음. 1.2 초기화 리스트 : initializer_list 헤더에 정의 : 파라미터 개수가 가변적일 때 사용하면..
면접 공부하면서 글을 쓰는거라 내방식 대로 서술함. 다소 두서가 없을 수 있음. 1. typedef : 새롭게 타입을 만들지 않고, 이미 정의된 타입에 또다른 이름을 부여하는 것(참조와는 다름) : ex) typedef double* d_ptr; --> double* 타입에 또 다른 이름인 d_ptr을 부여함. : ex) d_ptr attack; --> double* 형의 attack이라는 변수 1.1 typedef를 쓰는 경우는 언제일까? : 이름이 너무 길 때, 간편하게 쓸 수 있음 : ex) void ProcessPacket(const std::vector& val); : 위의 ProcessPacket이라는 함수의 파라미터는 단 하나인데, 엄청나게 길다 .... 이럴 때 쓰면 좋다. : typede..
면접 대비용으로 작성한 것이라 나를 제외한 보는 사람에겐 두서 없어 보일 수 있음. 1. const 는 일단 절대 변경 되지 말아야 할 것을 지정해주는 것임. 우리가 코드를 작성할 때 const에 대한 변경을 시도한다면 컴파일러가 잡아낸다. 2. const 포인터 int* myScore; myScore = new int[50]; myScore[3]=10; 위 코드가 있다고 가정해보자. myScore는 50칸 짜리 int형 배열을 가리키고 있다. myScore가 가리키는 데이터가 변경이 되지 않게 하려면 위 코드에서 int* myScore --> const int* myScore 혹은 int const* myScore로 변경해주어야 한다. 이렇게 된다면 위 코드에서 myScore[3] =10 부분에서 컴파..
면접대비용으로 정리한거라 남들이 보기에 다소 두서 없을 수 있음 참고바람 1. 이동 시맨틱은 이동 생성자, 이동 대입 연산자를 통해 지원함. 이동 생성자, 이동 대입 연산자는 원본 객체 --> 새로운 객체로 복사 --> 원본 null로 초기화 의 과정이다. 즉 객체에 대한 메모리 소유권을 이동함. 그 결과 댕글링 포인터나, 메모리 릭 발생을 예방함. 2. 이동 시맨틱은 r-value 참조로 구현됨. 내가 어떤 클래스를 구현했고, 그 클래스가 이동 시맨틱으로 동작하게 하려면 위에서 언급한 1 2 3 4 5 6 class LiverPool { public: LiverPool(LiverPool&& val) noexcept; // move construtor LiverPool& operator=(LiverPoo..
면접 대비용으로 공부하면서 정리한거라 다소 두서가 없어 보일 수 있음. 1. 참조형 변수는 생성하자마자 초기화 해야함 예 int ace = 10; int& son = ace; 1.1 참조를 한 변수 (위에서 son)를 변경하면 원본(위에서 ace)도 변경된다. 1.2 클래스 멤버 변수는 생성하자마자 초기화를 해주지 않아도 된다. 1.3 숫자와 같은 것들은 참조를 할 수 없다. 예 int& ronaldo = 7; --> 생각해보면 말이 안된다. 변경을 할 수가 없는데 어찌 참조하나 * 그대신 const 키워드가 있으면 가능하다 const int& ronaldo = 7 뭐 이런식으로 말이지. 1.4 참조형 변수는 한 번 선언할 때 초기화 되면 참조 대상은 절대 바뀌지 않는다. 단지 값만 바뀔 수 있다. 1...
- 저장하는 기능은 사실 다 memory 이다. (통상 RAM을 메모리라고 부름) - 메모리라고 할 수 있는건 RAM , 레지스터(cpu안에 있는) , 캐쉬(cpu에 근접해 있는 것.CPU에 남는 공간에 존재) 디스크 등등이 존재. cpu(레지스터) - 캐시 - 메모리 - 하드 디스크 이렇게 생각하면 됨 1. 캐시 메모리 - 프로그램의 특성(한번 접근하면 다시 또 접근하는 것) --> Temporal Locality - 프로그램의 특성2(이미 접근을 한 곳 근처에 접근하는 것, 배열을 for문 돌린다고 생각해보자) --> Spacial Locality 2. 가상 메모리 - 페이지 : 가상메모리 블럭 - 페이지 프레임 : 실제 RAM 블럭 - MMU : 메모리 관리하는 유닛 - 스왑파일 : 하드디스크가 이..
1. 유저 모드 동기화 vs 커널 모드 동기화 - 유저 모드는 시스템콜을 하지 않기 때문에 성능이 좋음. 다만 기능 제한 - 커널 모드 동기화는 시스템콜을 하기 때문에 상대적으로 불리. 다만 유저모드에서 사용하지 못하는 기능 사용 가능 1. 유저모드 동기화 - Critical Section : 원하는 영역을 Enter Leave로 잠금 - Interlocked : 전역으로 생성된 단 하나의 변수를 ++ 하거나 -- 하는 것이라면 동기화는 이게 더 낫다. 단 한줄로 동기화가 가능하기 때문 LONG interlockedIncrement(LONG volatile* 변수) LONG interlockedDecrement(LONG volatile* 변수) 다른 인터락 함수도 있음 MSDN https://docs.m..
1. 쓰레드와 프로세스의 차이 스레드는 하나의 프로그램안에서 여러 실행 흐름을 둔다. 가령 배틀그라운드라는 하나의 프로그램을 실행한다고 치자. 렌더링 작업만 하는 스레드 , 통신을 담당하는 스레드 입력을 처리하는 스레드 등 뭐 이런식으로 생각할 수 있다. 멀티 프로세스(가령 카톡 크롬 게임)는 독립적인 구조이다.(보통 그렇다는 이야기) 반면에 쓰레드는 공유하는 요소들이 있다. --> 이것때문에 컨텍스트 스위칭 비용(시간이)이 더 효율적이다. --> 캐쉬 메모리에 있는걸 그대로 갖다 쓰면 되니까 set을 할일이 별로 없고 get만 해오면 된다 메모리의 관점에서 스레드와 프로세스를 비교하는 것이 이해하기 쉽다. 프로세스는 생성하면 자체적으로 독립적인 메모리 공간을 가진다(그래서 통신이 필요하다면 IPC 인가..