SW 그리고 아빠 엔지니어링 중...

아는 만큼 보이고, 경험해봐야 알 수 있고, 자꾸 써야 내 것이 된다.

C++11 23

컴파일러와 페어 프로그래밍 - 특별 멤버 함수 편 🚀

💬 최근 AI 페어 프로그래밍 교육을 들으며, AI에게 도움받는 영역이 훨씬 높은 수준까지 이르렀다는 생각이 들었다. 특별 멤버 함수(Special Member Function)는 컴파일러가 사용자 코드 작성에 따라 생성 유무가 달라지기에 컴파일러와 페어프로그래밍이란 제목을 써봤는데, 아무튼 본 글에서는 컴파일러가 바라보는 특별 멤버 함수 생성 규칙에 대해 알아보자. 누가 특별 멤버 함수(Special Member Function) 인가? 우선 예제 코드를 통해 어떤 게 특별 멤버 함수 인지를 확인해 보자. Examplestruct Object{ std::string name; int data; Object() {}; //1. ~Object() {}; //2. Object(const ..

L C++ 2024.08.15

'0' 대신 'nullptr'를 써야 하는 이유

💬 C++ Core Guidelines에서는 '0' 혹은 'NULL'보다는 'nullptr'를 사용하라고 권장하고 있는데, 권장하기에 사용하기보다는 왜 nullptr를 쓰는 게 나은지 다양한 방법으로 알아보자.nullptr를 써야 하는 이유널포인터 대신 0을 사용하면서 오류가 발생한다.사례 1Exampleint main() { int* p1 = 0; int* p2 = nullptr;} 위 코드는 문제없이 p1, p2에 널 포인트가 대입이 된다. 다음 예제도 문제가 없는지 검토해 보자.Example void foo(int* p) {} int main(){ int n = 0; foo(0); //1 ?? foo(n); //2 ??} 주석의 결과를 확인해 보면 다음과 같다.주석 1 : ..

L C++ 2024.08.04

(응용) 생성자(constructors) 초기화

💬 누가 만들어 놓은 클래스에 API만 추가한다면 크게 고려할 일이 없겠지만 언젠가는 새로운 클래스를 만들고 기존 클래스를 상속해서 파생 클래스를 만드는 때가 올 것이다. 파생 클래스를 만들고 가장 먼저 작업하게 되는 것은 초기화이다. 이 초기화를 할 때 생성자 호출 순서를 잘 이해하고 있어야 올바른 설계를 할 수가 있다. 몇 가지 응용사례를 통해서 생성자 호출 순서를 알아보자. ⚠ 본 글을 기본적인 생성자 초기화는 알고 있다는 가정하에 작성되었다. 혹시 내용이 어렵다면 아래 내용을 먼저 이해하고 다시 읽어주길 바란다. - 2024.04.17 - [L C++] - (기초) 생성자(constructors) 초기화 🎯 Quiz : 당신에게는 아래는 stream 클래스 이용해서 pipeStream 파생클래스를..

L C++ 2024.04.21

(기초) 생성자(constructors) 초기화

생성자에서의 초기화 이것이 왜 좋은 코드인지 알아보자. class A { // Good string s1; public: A() : s1{"Hello, "} { } // GOOD: directly construct // ... }; 일전에 대입과 초기화에 대한 내용을 정리했었는데, 초기화와 별도로 대입을 하면 user defined type은 함수가 호출되는 동작을 추가로 하게 된다. 아래코드에 B 클래스는 얼핏 보면 생성자 안에서 바로 s1을 초기화했지만 사실 이것은 초기화를 한 후 대입을 한 것이다. class B { // BAD string s1; public: B(const char* p) { s1 = p; } // BAD: default constructor followed by assignme..

L C++ 2024.04.17

std::move the 이해하기

💬 혹시 std::move 쓰시나요? copy 보다 더 빠르다는 이유로 무분별하게 쓰고 있지 않은 지, copy보다 빠를 것을 기대하고 사용하고 있었으나 실제로 빠르게 동작하고 있나요? 아니면 찜찜해서 아예 사용하지 않고 있나요? 🎯 이번에 제대로 이해하고 올바르게 사용해 봅시다. 📍 오해 풀기 : std::move는 리소스 소유권을 이동시킨다❗ or ❓ 🤔 더 정확히는 std::move 자체가 소유권을 이동시키는 것이 아니라, std::move의 대상이 되는 객체들의 이동 생성자를 호출되게 하는 역할만 하고, 소유권 이동의 유무는 이동 생성자 내부에 즉 객체 설계에 따라 (되고 안되고 가) 결정이 된다. 🔍 move가 어떻게 구현되어 있는지 들여다보자. move는 단지 r-value 참조로 캐스팅하는 ..

L C++ 2024.04.12

perfect forwarding을 perfect하게 이해하기

🎯 지난 글에서 C++ 핵심 가이드라인에 'F.19: "전달(forward)" 매개변수는 TP&&타입과 std::forward로만 전달하라' 에 대한 설명이 빈약했는데, 본 글에서 perfect forwarding에 대해 알아보고, C++ 핵심 가이드라인의 의미도 이해해 보자. 💬 std::forward를 이해하려면 참조 축소 규칙을 우선 이해해야 한다. Reference Collapsing Rules(참조 축소 규칙) 💬 참조 축소 규칙을 설명하기 이전에 우선 아래 내용에 대해 생각해 보자. reference의 reference는 과연 컴파일이 될까? int main() { int x = 10; int& r = x; int& & rr = r; //reference의 reference 과연될까? retu..

L C++ 2024.03.29

memory order 조정 이야기

프로그램 코드들은 기계어로 변환되어 메모리에 올라가고 fetch, decode, execute를 반복하며 수행이 된다. L fetch(명령어 가져오기) decode (명령어 해석하기) execute (명령어 실행기) 이때 메모리 순서라고 하는 것은 결국 CPU가 메모리에 있는 명령어를 읽는 순서를 말하는데 pc -> 0x0000 mov .... 0x0001 add .... 0x0002 mov .... *pc (프로그램 카운터) 이 순서가 컴파일 시 컴파일러에 의해 혹은 런타임 중에 CPU에 의해 조정될 수 있기에 이에 대해 알아보자. CPU에 의해 조정되는 메모리 순서아래 표에도 나와있지만 모든 CPU가 메모리 순서 조정을 지원하진 않는다. 전통적인 아키텍처인 X86과 AMD, 즉 당신의 PC는 메모리 ..

L C++/Concurrency 2024.01.30

[Concurrency] lock-free와 mutex사이 spin lock

2024.01.16 - [L C++] - [Concurrency] ❇ std::atomic ❇의 이해 이전 글에서는 lock-free 관점에서 쓰다 보니 spin lock은 쓰면 안 되는 것처럼 생각할 수 있는데 본 글에서 spin lock의 필요성에 대해 이야기하고자 한다. spin lock의 필요성 이해 context switching에 따른 오버헤드 발생 Context switching은 CPU가 현재 실행 중인 프로세스나 스레드를 중단하고 다른 프로세스나 스레드를 실행하는 작업을 말한다. 우선 아래 예제를 보자. 예제 1 두 개의 스레드가 공유 데이터를 호출하는데 공유 데이터 접근은 mutex로 처리한 프로그램 코드이다. #include #include #include #include std::m..

L C++/Concurrency 2024.01.23

[Concurrency] 동기화 기본 요소(synchronization primitive) 정리

각각의 동기화 기본 요소 리포팅이 완료되어 전체를 일괄 정리해 보자. 각각의 동기화 기본 요소(synchronization primitive)를 정리해 보면 다음과 같다. (각 요소의 세부 내용은 제목에 링크를 걸어 놨다.) Condition variables (C++11) 조건 변수는 여러 스레드가 서로 통신할 수 있도록 하는 동기화 기본 요소입니다. 이를 통해 일정 수의 스레드가 다른 스레드로부터 진행될 수 있다는 알림을 기다릴 수 있습니다(시간 초과 가능). 조건 변수는 항상 뮤텍스(Mutex)와 연결됩니다. Semaphores (c++20) 세마포어는 공유 리소스에 대한 동시 액세스를 제한하는 데 사용되는 경량 동기화 기본 요소입니다. 둘 중 하나라도 충분할 경우 세마포어는 조건 변수보다 더 효율..

L C++/Concurrency 2024.01.19

[Concurrency] ❇ std::atomic ❇의 이해

발행 : 2014/01/16 수정 : 2014/01/20 - atomic에 대한 전체 내용에 대한 링크 추가 - 메모리 오더 옵션에 대한 정보 추가 - gcc에서 is_lock_free 가 에러 나는 이유 추가 본 글을 atomic 중 lock free에 대해 중점적으로 설명한 내용입니다. (상세 설명은 제일 밑 참고에 링크를 추가하였습니다.) atomic의 사전적 의미 원자성(原子性, atomicity)은 어떤 것이 더 이상 쪼개질 수 없는 성질을 말한다. 어떤 것이 원자성을 가지고 있다면 원자적(atomic)이라고 한다. 생각해 봅시다. C++ 코드에서 원자적인 것은 어떤 것이 있을까요? 한 줄짜리 코드인 x++ 는 원자적일까요? 정답은 아니다. 한 줄짜리 x++을 기계어로 변환하면 아래와 같이 3개..

L C++/Concurrency 2024.01.16
320x100