C++ 12

12. [C++] atomic/ mutex/ spin lock

멀티 코어 환경에서 동기화 자원의 접근을 보장하는 방법은 여러가지가 있습니다. 대표적인 방법으로는 os 가 제공하는 동기화 방법인 mutex와 cpu의 하드웨어 명령어를 직접사용하는 atomic 방법이 있습니다. 추가로, 락이 풀릴 때까지 무한 루프를 돌며(cpu를 계속 점유하며) 대기하는 방식인 스핀락이 있습니다. 오늘은 이 세가지 방식에 대해서 알아보겠습니다. 1. mutexmutex 방식은 스레드가 자원을 사용하려고 할 때 lock을 걸어 (sleep) 대기하여 동기화 자원의 접근을 보장하는 방법입니다. 이는 운영체제 커널이 관리하는 락 메커니즘을 사용하며, 락을 잡지 못한 스레드는 대기 상태(sleep)로 들어가면서 다른 스레드가 CPU를 쓸 수 있도록 해줍니다. 그래서 락이 풀릴 때까지 해당 ..

C++ 2025.06.15

11. [C++] 파티션 메모리 복사 (dd 명령어, 파일 입출력)

개요eMMC와 같은 저장 장치는 하나의 물리적 장치입니다.이 장치를 논리적으로 나누는 것을 파티션이라고 하는데, 저장장치 안에서 영역을 구분해주는 역할을 합니다.리눅스와 같은 운영체제에서는 커널 내부에 VFS(Virtual File System)이라는 추상화 계층이 있어 여러 파일 시스템과 장치 파일을 통합 관리합니다. eMMC와 같은 특정 하드웨어에 유저가 접근하려면, VFS가 유저의 요청을 디바이스 드라이버로 전달하고, 드라이버가 하드웨어와 직접 통신하여 데이터를 읽거나 씁니다. 따라서 유저는 직접 물리 메모리에 접근하지 않고, 커널을 통해 메모리와 하드웨어 자원에 접근할 수 있습니다. 리눅스 커널 내부의 VFS(Virtural File System)는 /proc, /sys, /dev 와 같은 가상 ..

C++ 2025.06.03

10. [C++] 가중치가 없는 그래프에서 사이클 탐지 및 지름 구하기

문제)N개의 정점과 M개의 간선을 가진 가중지가 없는 그래프 G가 주어진다. 그래프 G 에서 사이클을 이루는 노드들이 존재할 경우 사이클에 포함된 노드를 제거한 이후 남은 노드 및 간선에서 가장 먼 두 노드의 거리를 출력한다. 예시 입력)10 111 22 33 13 44 55 62 78 99 10 단계1. 가중치가 없는 양방향 그래프를 구성한다. : 연결 확인 시 어느 방향으로든 이동 가능한 경우 graph[A].push_back(B), graph[B].push_back(A)로 인접리스트 구현#include #include #include using namespace std;const int MAX = 100005;vector graph[MAX];int main() { int N, M; ci..

C++ 2025.06.03

09. [C++] 벡터와 리스트에서의 erase/remove 사용법

벡터와 리스트에서의 erase 사용법에 대해 알아보기 전에 벡터와 리스트를 잠시 비교해보겠습니다.vector와 list는 모두 sequence container로, sequence container에는 forward_list, list, deque, vector, array 등이 있습니다. list의 경우에는 bidirectonal iterator를 사용하는 이중 연결리스트(앞뒤 이동만 가능)이고, vector의 경우에는 contiguous iterator를 사용하는 연속된 배열(Random access 지원)이다. vector는 인덱스 접근이 빠르고 메모리를 효율적으로 사용할 수 있다는 장점이 있지만 연속된 배열이기 때문에 앞이나 중간에 데이터를 삽입하거나 삭제하면 해당 원소의 뒤 원소들을 모두 이동..

C++ 2025.06.01

08. C++_string class와 관련 기능

string 클래스는 C++ STL에서 제공하는 클래스로, 말 그대로 문자열을 벡터와 같이 다룰 수 있게 해주는 클래스 입니다.C에서는 char* 또는 char[] 의 형태로 문자열을 다뤘다면, C++에서는 문자열을 하나의 변수 타입처럼 사용하며, std::string은 C++표준 라이브러리의 일부분으로 문자열 처리를 위한 다양한 기능을 제공합니다. C++의 std::string 클래스와 C의 문자열을 다루는 방식에는 몇 가지 중요한 차이가 있습니다. 이 차이점들은 주로 사용의 메모리 관리, 사용의 편의성, 기능성 등에서 나타냅니다. 1. 메모리 관리C문자열은 메모리 관리를 사용자가 직접 해야합니다. 문자열의 크기를 미리 할당해야 하고, 필요에 따라 메모리를 할당하거나 해제해야 합니다. 이로 인해 메모리..

C++ 2024.06.16

09. C++_동적으로 배열 할당하기

단일 변수에 대한 동적할당 외에 포인터를 활용하여 배열 변수를 동적할당 할 수 있다. 컴파일 타임에 배열 길이를 정하는 고정 길이 배열과는 다르게 배열을 동적으로 할당하면 런타입 동안에 배열 길이를 선택할 수 있다.동적으로 배열을 할당하려면, new 연산자와 delete연산자를 사용해야한다. 1. 1차원 배열 동적 할당 하기 1차원 배열은 배열의 이름이 곧 그 배열의 시작 주소이다.int형 자료구조의 방을 가리키는 num 포인터 변수에 생성하고자하는 size를 가지는 동적 메모리를 할당한다.#includeusing namespace std;int main() { //실행중에 배열의 크기 입력받아 1차원 배열 동적 할당하기 int length; int* num; cin >> length; num = new..

C++ 2024.05.16

07. C++_call by value/call by pointer/ call by reference 이해하기

1. Call by valueCall by value란 함수 호출 시 넘기는 인자의 값이 매개변수에 복사 되어서 함수에서만 동작하도록 하는 것이다.Call by value로 전달된 매개변수는 함수 내의 지역 변수 역할을 하며 함수가 종료될때 함께 종료되어 사라진다.따라서 swap을 해도 값이 바뀌지 않는다. void callByValue(int a, int b){ int temp = a; a = b; b = temp;}int main() { int a = 10; int b = 20; callByValue(a, b); cout >> 10, 20  2. call by pointercall by pointer는 포인터를 통해 변수 a와 변수 b에 대한 주소를 직접 가져와서 함수 내부에서 포인터를 역참조(*a,..

C++ 2024.05.16

05. C++_파일 입출력

파일 입출력 클래스는 fstream 클래스에 있다. 클래스의 open()메소드를 통해 파일을 열거나 생성할 수 있다. 파일을 닫을 때는 close()를 호출하여 명시적으로 파일을 닫을 수 있다.파일을 읽어들이는 방법으로는 한글자씩 읽어들이는 방법(get), 한줄씩 읽어들이는 방법(getline), 끝이 날때까지 읽어들이는 방법(!readFile.eof()) 등이 있다.#include #include using namespace std;int main() { //파일 쓰기 ofstream writeFile; writeFile.open("test.txt"); char str[256] = "wonderful world"; writeFile.write(str, strlen(str)); writeFile.clos..

C++ 2024.05.15

04. C++_얕은복사/깊은복사

객체를 복사한다는 것은 내용을 다른 객체로 복사하는 것을 의미하는데, 클래스의 객체가 다른 객체로 복사될 때는 보통 매개변수로 같은 클래스의 객체를 받아서 그 객체의 내용을 복사하여 새로운 객체를 생성하는 복사 생성자 (copy Constructor)에 의해 복사가 수행됩니다. 이 때, 복사 생성자가 어떻게 구현이 되었냐에 따라 객체 복사가 깊은 복사인지, 얕은 복사인지 결정되게 됩니다. 이번 포스팅에서는 깊은 복사, 얕은 복사에 대한 개념과 간단한 예제에 대해 알아보겠습니다.깊은 복사(Deep copy)깊은 복사는 객체를 복사할 때 해당 객체가 동적으로 할당된 메모리를 사용하고 있다면, 이 동적 메모리까지 새롭게 할당하고 복사하여 두 객체가 완전히 독립적인 데이터를 갖도록 하는 것입니다. 따라서 포인터..

C++ 2024.03.24

03. C++_invoke

일반적으로 클래스의 멤버함수를 호출할 때 멤버함수와 함께 객체의 정보가 함께 전달됩니다. 따라서 static 이 아닌 멤버 함수는 함수가 호출될 때 컴파일러가 객체의 객체의 정보 또한 함수의 인자로 전달을 하는데 이것을 thiscall이라고 합니다.  예를 들어 인자가 1개인 멤버 함수 mf1(int a)가 있다고 했을 때, 실제 객체가 함수를 호출할 때에는 mf1(&pt, int a)와 같이 2개의 인자를 전달하는 형태로 바뀝니다.  멤버 데이터는 객체당 한개씩 생성되는 반면, 멤버 함수는 여러 객체가 있어도 하나만 존재하는데 컴파일러에서 멤버함수를 호출할 때 객체에 대한 정보를 보내주기 때문에 멤버함수의 인자가 어떤 객체의 멤버인지 알 수 있습니다. class Point{ int x{0}; int y..

C++ 2024.03.24