C++ 20

C++ static variable, static member variable, static member function

C++에서는 static 키워드란 것이 있다. static의 의미는 정적이다는 것인데 이것이 변수에도 붙을 수도 있고, 함수에도 붙을 수 있다. 그리고 클래스 내에서 static은 또 다른 의미를 갖는다. static에 관한 내가 잊고 있었거나, 처음 알게된 사실들을 정리해보고자 한다. 우선 static변수의 특징부터 복습해보자. static변수는 전역 변수와 지역 변수로서의 특징을 모두 갖는다. 1. 전역 변수처럼 프로세스가 시작할 때(main 함수 시작 전에) 메모리가 할당되고 프로그램이 종료될 때 까지 메모리가 할당된 채로 남아있다. 지역 변수는 해당 블록이 끝나면 파괴되는 것과는 대비된다. 2. static 지역 변수가 블록 안에서 선언된 것이면 그 블록 밖에서는 사용이 불가능하다. 신기하게 메모..

공부/C || C++ 2021.07.23

오브젝트 풀(Object Pool)

메모리 풀에 이어서 이번에는 오브젝트 풀을 스스로 구현해보았다. 사실 구현이라고 할 만큼 뭔가 대단한 걸 한건 아니고 그냥 내가 이해한 걸 간략하게나마 코드로 짜본 것인데 뒤에 언급하겠지만 사실 성능상의 문제점도 존재하고 완벽히 정확하게 구현했는지는 잘 모르겠다. 우선 오브젝트 풀이란 프로그램 내에서 사용할 오브젝트들을 container(ex. list, vector)나 container adaptor(ex. queue, stack)에 담아 두었다가 사용자가 요청시 꺼내서 주고, 반환시 container에 다시 담아두는 것을 의미한다. 만약 동적 할당및 해제가 잦은 프로그램내에서 오브젝트 풀을 사용한다면 잦은 할당및 해제로 인한 오버헤드와 메모리 단편화도 조금 방지할 수 있다고 생각한다(사실 요즘 mem..

공부/그 외 2021.07.19

C++ 대입 연산자는 왜 void로 선언하면 안될까? 반환 타입에 왜 참조자를 붙여야 할까?

class AAA { public: int x; int y; public: AAA(int _x, int _y) : x(_x), y(_y) {}; } 위와 같은 클래스가 있을 때 대입 연산자를 어떻게 작성할까? 대부분 아래와 같이 작성 할것이다. AAA& operator=(const& AAA aaa) { x = aaa.x; y = aaa.y; return *this; } 여기서 의문점이 드는것은 두가지였다. 첫번째는 그냥 대입만 하면 되니까 void 리턴 타입으로 하면 되지 않을까? 였다. 첫번째 의문은 나와같은 의문을 가진 사람의 stackoverflow 질문에 대한 답변에서 찾을 수 있었다. 결론부터 이야기하면 void 리턴타입으로 대입 연산자를 만드는게 가능은 하지만, 그렇게 하면 A = B = C같..

공부/C || C++ 2021.07.18

char*를 cout으로 출력할 경우 주소가 올바르게 나오지 않는 경우

reinterpret_cast를 이용해서 int*를 char*로 cast해서 주솟값을 std::cout을 이용해서 확인해보니 주솟값이 출력이 안되는 경우가 있었다. 처음엔 reinterpret_cast에 대해서 내가 잘 모르는게 있는줄 알고 열심히 찾아봤는데 그게 아니고 헤더 중에서도 출력과 관련 있는 에 대해 내가 모르는게 있었다. C++에서 을 이용해서 아래 코드처럼 char*의 주솟값을 출력하려고 하면 아무것도 출력되지 않는다. int memory[10]{ 1,2,3,4,5,6,7,8,9,10 }; int main() { int* p = memory; char* c = reinterpret_cast(p); cout

공부/C || C++ 2021.07.09

C++ 전처리기(preprocessor)

전처리기란 컴파일 전에 실행되는 코드로써 #으로 시작한다. 종류로는 include, Macro 그리고 조건부 컴파일(Conditional compilation)이 있다. 1. include 다들 알다시피 컴파일러와 함께 제공되는 헤더파일은 를 이용해서 포함시키고, 따로 사용자가 작성한 헤더파일은 소스코드가 있는 경로 기준으로 해서 ""를 이용해서 포함시킨다. 예를 들어서 아래와 같다. #include // 컴파일러에서 제공되는 헤더파일 #include "MemoryBlock.h" // 사용자 정의 헤더파일 2. Macro Macro에는 #define을 이용해서 만들고 종류는 객체와 유사한 매크로와 함수와 유사한 매크로가 있다. 객체와 유사한 매크로는 다시 대체 텍스트가 있는 것과 없는 것으로 나뉘는데 예..

공부/C || C++ 2021.07.08

복사생성자란(copy constructor)?

1학년때 C++를 배울때 copy constructor를 처음 접했을땐 어려워서 열심히 공부해서 겨우겨우 이해해서 시험친 기억이 난다. 그때 기억으로는 다 이해했고 안까먹을거라 생각하고 넘어갔지만 막상 몇년이 지나니 까먹은 것 같아서 이 기회에 다시 정리한다. 1. 왜 써야 하는가? 우선 copy constructor라는걸 왜 써야하는지에 대한 의문은 쓰지 않았을 때 생기는 문제에 대해 생각해보면 쉽게 해결된다. 예를 들어 다음와 같은 코드가 있다고 하자 class person { int m_tAge; char* m_pName; public: person() { } person(int _age, char* _name) { m_tAge = _age; m_pName = new char[strlen(_name..

공부/C || C++ 2021.07.05

C++11 가변 인자 함수 템플릿(variadic template)

#define va_start(ap, v) ( (ap) = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) ) 사실 가변 인자 함수 템플릿이란 용어는 winapi 강의를 들으면서 처음 접해보는 단어였다. 그때는 이렇게 쓰면 되는구나~ 하고 넘어 갔는데 이번 기회에 좀 더 자세히 정리해보고자 한다. 사실 가변 인자 함수 템플릿 전에 가변 인자 함수라는 것을 알아보자. 가변 인자 함수는 말 그대로 함수의 인자 갯수가 1개부터 여러개가 될 수 있도록 정의 하는 개념을 의미한다. C에서 printf 함수를 예로 많이 든다. printf("%d\n", 3); printf("%d, %d\n", 3, 4); printf("%d, %d, %d\n", 3, 4, 5); printf("%d, %d, ..

공부/C || C++ 2021.07.04