언어/C++ 8

아토믹으로 Lock-Free 자료구조 만들기

2022.07.03 - [언어/C++] - 아토믹 (Atomic, cpp17) 아토믹 (Atomic, cpp17) 왜 필요? #include #include #include using namespace std; void add (int & num) { for(int i=0;i threads; for (int i = 0; i < 4; ++i) threads.emplace_back(add, std::ref(num)); for (auto & thread : thre.. tsyang.tistory.com Thread-Safe한 자료구조가 필요하다고 하자. mutex등을 이용해서 자료구조로의 접근을 제한하는 방식은 느리다. 이전 글에서 다룬 atomic을 이용하여 스핀 락을 만든다면 mutex보다 더 빠른 락을 ..

언어/C++ 2022.07.10

Cpp 함수 (C++11 lambda, std::function)

C++11에 추가된 람다와 function wrapper는 Cpp에서도 함수형 프로그래밍이 어느정도 가능하게 해줬다. (그럼에도 Cpp는 기본적으로 객체지향 프로그래밍 + performance에 최적화 되어있다고 보아야 한다. + DOP를 더한 정도?) 아무튼 함수를 object/variable 처럼 다루기 편해짐. Function Object 함수형 프로그래밍의 시작은 함수를 변수처럼 다룰 수 있어야 한다는 것이다. 기존(C++11이전의) Cpp에서는 함수 오브젝트를 사용했는데 대충 다음과 같다. #include using namespace std; class Plus { public: explicit Plus(int val) : local_val_{val} {} int operator() (int x..

언어/C++ 2021.07.31

Cpp - 상속#2

2021.07.18 - [언어/C++] - Cpp - 상속#1 Cpp - 상속#1 기본적인 내용은 안 씀. 상속 상속은 왜 쓸까? 클래스 간의 관계 : 동물 -> 고양이 사람.. 코드 재사용 : 동물은 잠을 자.. 그럼 고양이 사람도 다 잠을 자 일관적인 클래스 인터페이스 (class interface tsyang.tistory.com Object Slicing 오브젝트 슬라이싱은 Cpp 상속에서 발생하는 문제이다. using namespace std; class Animal { public : void virtual Speak() { cout

언어/C++ 2021.07.22

Cpp - 상속#1

기본적인 내용은 안 씀. 상속 상속은 왜 쓸까? 클래스 간의 관계 : 동물 -> 고양이 사람.. 코드 재사용 : 동물은 잠을 자.. 그럼 고양이 사람도 다 잠을 자 일관적인 클래스 인터페이스 (class interface consistency) : abstract, interface , pure virtual function dynamic function binding (virtual function, virtual table) 상속을 받을 때는 public, protected, private 키워드를 붙일 수 있다. 설명은 주석으로 대신한다. class A { public: int x; protected: int y; private: int z; }; class B : public A { // x is..

언어/C++ 2021.07.18

C++ (복사/이동) 생성자, 할당자, Rule of Three(Five)

Cpp 의 클래스에는 기본 생성자 말고도, 소멸자, 복사 생성자, 복사 할당자, 이동 생성자, 이동 할당자가 존재한다. 위의 다섯가지는 컴파일러가 알아서 만들어 주기 때문에 (기본 생성자 까지도), 일반적으로는 구현할 일이 없지만 만약 클래스에서 raw pointer 멤버 변수 등을 가지고 있어서 메모리 관리가 필요한 경우에는 위와 같은 생성/할당/소멸자를 프로그래머가 직접 구현해 줘야 한다. 이동 생성/할당자를 뺀 세가지를 구현해야 한다는 법칙을 Rule of Three, 이동 생성/할당자를 포함하면 Rule of Five 라고 부른다. 그냥 코드에 주석달았음 참고로 noexcept 같은 경우에는 성능상의 이점도 있다고 한다. C++11 부터는 소멸자 등에 자동으로 컴파일러가 붙여준다고 함 class ..

언어/C++ 2020.11.08

스마트 포인터

RAII RAII : Resource Acquisition Is Initialization 리소스의 라이프사이클과 오브젝트의 라이프사이클을 일치시킨다는 뜻이다. 여기서 리소스란 메모리, 쓰레드, 파일IO, 뮤텍스 ,DB와의 커넥션 등이 있다. C++ 에서는 스마트 포인터를 이용하여 메모리 리소스와 인스턴스의 라이프사이클을 일치시킬 수 있다. unique_ptr 유니크 포인터는 exlusive ownership을 제공하는 스마트 포인터다. 유니크 포인터는 하나의 오브젝트(메모리 영역)을 단 하나의 포인터만 가리키게 한다. include ... class Cat { public : Cat() : mAge{1} {} ~Cat(){} void speak(){cout

언어/C++ 2020.11.08

L_value와 R_value

L-value & R-value L value는 왼쪽에 있는 거, R value는 오른쪽에 있는 거... 가 아니다. L-value는 나중에 다시 부를 수 있는 것. R-value는 그렇지 못한 것.으로 구분하면 쉽다. 예를 들어, int a=0; int b=a; 에서 a 는 L-value이다. 0은 다시 부를 수 없으므로 R-value이다. b 역시 L이겠지? R-value는 임시적으로 생성된 값이라고 볼 수 있다. 그러면 대체 왜 이런 걸 구분할까? R-value를 잘 이용하면 메모리를 효율적으로 사용할 수 있기 때문이다. 예를 들어, 어떤 값이 R-value이고 이 값을 전달하기 위해 몇 개의 변수를 거친다고 가정해보자. 이 값을 전달하기 위해 변수를 거칠 때마다 값을 복사할 필요가 있을까? 어차피..

언어/C++ 2020.10.11