C++에서 메모리 동적할당에 사용하는 malloc 함수나 new 연산자 같은 경우, 몇가지 문제가 존재한다. 다양한 메모리 사이즈들이 할당, 해제되면서 연속적인 메모리 공간이 부족해지는 메모리 파편화 문제나, 반복되는 할당+해제에 의한 성능저하를 생각해 볼 수 있다.메모리 풀(Memory Pool)을 이용하면 이런 문제들을 어느정도 해결할 수 있다.메모리 풀은 큰 사이즈의 메모리 블록을 미리 할당하여 malloc, new 연산자와 유사한 메모리 동적 할당을 가능하게 해준다. 큰 사이즈의, 연속적인 메모리 블록을 미리 할당하기 때문에 파편화를 어느 정도 해결할 수 있고, 사용한 메모리 공간을 해제하는 것이 아닌 재사용하는 방식이기 때문에 퍼포먼스 향상을 기대할 수 있다 고려사항구현 방법은 정말 다양하다. ..
c++
c++ STL에서 가장 많이 쓰이는 컨테이너 중 하나인 std::vector의 복사는 효율적일까?다음 코드를 실행시킨다 했을때using namespace std;class A{public: A() { cout temp1 = vector(10); vector temp2 = temp1;}temp2에 temp1을 복사 할 경우 그림과 같이 요소의 개수 N(위 예제에서는 5)번 만큼의 복사생성자가 호출된다.즉, vector의 복사생성자는 N개의 요소들을 각각 순차적으로 복사하는, O(N)의 시간복잡도를 갖게 된다. 궁금한 점은 vector는 연속된 메모리인데 비효율적으로 왜 모든 요소들을 각각 복사하는걸까? 연속된 메모리 구간을 통채로 복사해서(이를테면, memcpy와 같은) 복사하는게 아니라 각각 복사하는..
Struct구조체 Struct의 멤버 변수를 메모리에서 CPU로 읽을 때 한번에 읽을 수 있도록, 컴파일러가 레지스터의 블록, Word의 크기(64비트라면 8바이트, 32비트라면 4바이트)에 맞춰 바이트를 패딩시켜주는 최적화 작업을 수행한다. 만약 struct x{ char a; int b; char c;}struct x data;위 구조체의 메모리 크기인 sizeof(data)는 6바이트가 아닌 12바이트이다. 컴파일러가 구조체를 구성하는 멤버들을 가장 크기가 큰 멤버 자료형(여기서는 int)의 배수가 되도록 정렬했기 때문이다. 이 정렬을 위해 의미없는 바이트들을 더해 패딩해준 것이고, a와 c 뒤에 3바이트씩 패딩이 추가된다. struct x{ char a; char c; int b;}하지만 다음과 ..
서버와 DB를 연동하기 위해 MariaDB를 사용했는데, 생각보다 c++ 연동에 대한 정보가 없어 직접 DOCS를 보면서 사용법을 정리해보았다.본 글은 Visual Studio 2022, MariaDB 11.3 version을 기준으로 작성되었다. Visual Studio 설정1. MySQL/MariaDB c/c++ connector를 다운https://mariadb.com/docs/server/connect/programming-languages/cpp/ 2. Visual Studio에서 헤더파일 설정MySQL/MariaDB를 사용하고자 하는 프로젝트에서속성 -> C/C++ -> 일반 -> 추가 포함 디렉터리 추가 포함 디렉터리에 설치한 c/c++ connector에 포함된 헤더파일 경로를 지정해준다...
평소같이 기계적으로 프로그래머스 코딩테스트를 풀다가.. 벽에 부딪혔다. 나와 같은 실수를 하는 사람들을 위해 글을 남겨보겠다. https://school.programmers.co.kr/learn/courses/30/lessons/42897 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 풀이 문제는 평범한 DP문제였지만 생각해야 할 점은 집이 원형으로 이루어져 있기 때문에 이를 선형 자료구조인 vector로 다루기 때문에 이 점만 조심하면 된다. 따라서 까다로운 조건인 첫번째 집을 선택했을 때에 마지막 집을 포함하지 않아야 한다는 조건만 생각하면서 이를 ..
멀티스레드를 이용하는 서버 엔진을 설계해보면서 각 유저 세션의 송신버퍼(SendBuffer)를 불가피하게 Lock으로 관리해야 했다. 현재 구조에서는 문제가 없지만 나아가 Deadlock이나 Lock에 의한 성능 저하가 걱정되어 락 프리(Lock-Free) 알고리즘에 대해 공부해보았고 이를 정리해보았다. 락 기반 알고리즘의 문제점 Mutex, Semaphore나 를 이용한 Lock을 통해 멀티스레드를 관리할 때에는 Lock을 획득하지 못한 스레드는 Lock을 획득한 스레드가 해당 Lock을 Release 할때까지 대기상태에 머물러야 한다는 단점이 있음. 또 DeadLock과 같은 예상하지 못한 문제가 발생할 수도 있다. 한마디로 일반적으로 Lock 사용 시 공유 메모리에 접근하는 멀티쓰레드가 많아질수록 ..
이어서 소켓 통신에 대해 알아보기 전에, 우선 I/O 하면 자주 나오는 Synchronous/Asynchronous 와 Blocking/NonBlocking을 먼저 정리하고 넘어가도록 하자. 문서는 네이버 클라우드 플랫폼에서 작성한 게시글을 참고하였다! Synchronous/Asynchronous 와 Blocking/NonBlocking #Synchronous, 동기 I/O 요청 - 응답 작업이 일련의 순서를 따름. 작업의 순서가 보장됨. 작업 완료를 user space에서 판단. #Asynchronous, 비동기 kernal에 I/O 작업을 요청해두고 다른 작업 처리가 가능하나, 작업의 순서는 보장되지 않음. 작업 완료를 kernal space에서 통보. #Blocking, 블로킹 요청한 작업이 모두 ..
네트워크 프로그래밍을 공부하고 서버 엔진 구조를 짜보면서 공부한 필수 내용들을 정리해보았다. 물론 이 문서는 Windows 기반으로 winsock 라이브러리를 이용하여 진행되었다. 소켓 통신 소켓통신에 앞서, 소켓(Socket)이란 프로세스(어플리케이션 계층)에서 네트워크 프로그래밍을 사용하기 위한 인터페이스 정도라고 생각하면 된다. 흔히들 TCP, UDP라고 하는 전송 계층(Transport Layer)과 프로그래머가 개발하고자하는 응용 계층(Application Layer) 사이의 인터페이스로 소켓을 이용하면 간단하게 네트워크 프로그래밍을 할 수 있다. TCP vs UDP 위에서 말했듯이 전송 계층의 TCP와 UDP 프로토콜에 대해 간단하게 정리해보면 TCP 연결 지향 방식으로 패킷을 교환 - 논리적..