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

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

C++ 35

🚀성능 최적화 도구 - constexpr과 inline 함수 이해하기

🗨️ 프로그래밍에서 성능 최적화는 매우 중요한 주제이며 지금 얘기하는 내용들은 체감할 정도의 성능개선이 아니다. 하지만 constexpr과 inline 이 두 키워드의 의미와 사용법에 대해 알게 된다면 기계어 동작 간소화와 오버헤드를 절약하는 이점을 취하고, 기존 레거시 코드에 constexpr과 inline 도구를 잘 못 사용하여 성능을 저하시키고 있는 문제를 개선하게 될지도 모른다. 🤓 constexpr: 컴파일 시간의 마법📜 C++ core guidelines F.4: 함수가 컴파일 시간에 평가되어야 한다면 constexpr로 선언하라 constexpr란?📌 constexpr 발음을 어느 교수님께 배우느냐에 따라 조금씩 다르게 알던데 저는 뭐 '콘스트 익스퍼'라로 부르고 있다. constex..

L C++ 2025.03.21

🤔 스마트 포인터(unique_ptr, shared_ptr) 생성 시 make_shared(or make_unique)를 써야 하는 이유?

Q1. 스마트 포인터 unique_ptr, shared_ptr를 모른다.Q2. 스마트 포인터 unique_ptr, shared_ptr 생성 방법은?Q3. make_shared(or make_unique)를 써야 하는 이유는?* 3가지 질문에 대한 답을 알고 있다면 이 글을 읽지 않아도 된다. 😎🛫shared_ptr 생성 시에는 std::make_shared를 써라!C++에서 메모리 할당/해제는 의도치 않은 많은 이슈를 양산하기에 RAII(Resource acquisition is initialization)가 되는 걸 사용하라고 한다. 그중 하나인 shared_ptr에 대해 조금 알아보자. sample#include #include struct Point{ int x; int y; P..

L C++ 2025.03.14

남들 쓰듯이 쓰는 virtual이라면 고민할 필요 없는 알쓸 virtual 정보 📖

virtual은 컴파일 타임과 실행 타임 동작이 다르다.가상함수는 기본 값 설정을 하지 말자. (제발 ㅜㅜ) 가상함수에 기본 값을 세팅하는 데 기저 클래스와 파생 클래스에서 기본 값이 다르면 어떻게 될까? 🤔아래 예시는 이를 확인해 볼 수 있는 코드인데 동작 결과를 예측해 보자.example#includeclass Base{public: virtual void foo(int a = 10) { std::cout foo(); //1.}resultDerived : 10 예상했던 결과 값인가?💬 그냥, '제발 가상함수는 기본 값을 설정하지 말자'로 끝내고 싶지만 발생할 수 있는 문제점은 이해하고 넘어가는 게 좋을 테니 정리를 해보자. 우선 가상함수 컴파일 과정은 다음과 같다.컴파일러는 컴파일 시점에 vtab..

L C++ 2024.10.06

'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

new/delete 동작 원리 이해하기

💬 C++ core guidelines에 따르면 메모리 관리는 RAII가 되는 smart pointer를 권장하고 있다.하지만 이미 레거시 코드에 녹여져 있는 new/delete는 어떻게 해야 하나?🤔 또 malloc/free는?😨C++에서 malloc/free를 못 본 것 같긴 하지만 간단히 new/delete와의 차이점을 정리하고 new/delete를 좀 더 쪼개서 동작시키는 내용을 정리해 본다. 🚀 우선 new/delete 동작 원리를 알아보자.Examplenew/delete를 사용한 프로그램 코드이다.class Point{ int x, y;public: Point(int a, int b) { std::cout ResultPoint()~Point() 주석 1, 2의 동작 원리를 정..

L C++ 2024.07.22

애증의 const 사용하기 (2)

💬 지난 글에 이어 const를 쓰면서 막히는 사례를 풀어가 보자. 애증의 const 사용하기 (1)const 잘 쓰시나요?💬 나는 잘 사용하지 않는다. const를 사용하다 보면 에러가 자주 발생하고, 개발하는데 적지 않은 인터럽트가 걸린다. 이런 경험들이 반복되면서 자연스럽게 const 사용하지 않jabdon4ny.tistory.com 기존에 작성되어 있던 used defined type 객체를 멤버함수의 인자로 전달하는 경우를 생각해 보자. 예제 Point 객체를 foo 함수 인자에 상수 참조형으로 전달을 한 예제인데 멤버함수를 호출하면 에러가 발생한다.#include class Point { public: int x, y; int getX() {return x;}; int getY() {retur..

L C++ 2024.05.26

애증의 const 사용하기 (1)

const 잘 쓰시나요?💬 나는 잘 사용하지 않는다. const를 사용하다 보면 에러가 자주 발생하고, 개발하는데 적지 않은 인터럽트가 걸린다. 이런 경험들이 반복되면서 자연스럽게 const 사용하지 않게 되었다. 하지만 '에러가 잘 발생한다'는 것은 반대로 얘기하면 의도하지 않은 실수를 방지하기 위한 알람이기에 잘 쓰는 것이 좋다. (상수 장점 : 실수방지, 멀티스레드 안전)이번기회에 const를 잘 이해하고 써보자.  C++ 대체 언어로 거론되는 Rust는 C++과 반대로 기본이 상수이고, 변수로 사용하려면 키워드를 사용해야 한다. 다시 말해 대세란 말씀!C/C++C/C++int n = 0; //변수const int c = 0; // 상수RUSTlet mut n = 0; // 변수let c = 0;..

L C++ 2024.05.11

(응용) 생성자(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
320x100