C++ 32

SFINAE(Substitution failure is not an error)

참조: https://modoocode.com/255 씹어먹는 C ++ 토막글 3 - SFINAE 와 enable_if 모두의 코드 씹어먹는 C ++ 토막글 3 - SFINAE 와 enable_if 작성일 : 2019-01-05 이 글은 19113 번 읽혔습니다. 이 글은 여기 에 실린 SFINAE and enable_if 글을 바탕으로 쓰였습니다. C++ 에서 템플릿과 함수의 오 modoocode.com SFINAE는 치환실패는 오류가 아니다라는 말이다. 템플릿 매개변수에 자료형이나 값을 넣을 수 없어도 컴파일 오류가 발생하지 않고 해당 템플릿에 대해서는 코드 생성을 무시하는 현상. 템플릿 매개변수 입력에 제약을 걸어주고 함수 오버로딩 시 프로그래머가 함수 선택을 제어할 수 있게한다. 특정 형식에 대해..

C++ 2023.09.29

std::make_unique & std::make_shared

1. new의 직접 사용에 비해, make 함수를 사용하면 소스코드의 중복의 여지가 없어지고, 예외 안정성이 향상되고, std::make_shared와 std::allocate_shared의 경우 더 작고 빠른 코드가 산출된다. 2. make함수의 사용이 불가능 또는 부적합한 경우로는 커스텀 삭제자를 지정해야 하는 경우와 중괄호 초기치를 전달해야하는 경우 3. std::shared_ptr에 대해서는 make함수가 부적합한 경우가 더 있는데, 두 가지 예를 들면 1) 커스텀 메모리 관리기능을 가진 클래스를 다루는 경우 2) 메모리가 넉넉하지 않은 시스템에서 큰 객체를 자주 다루어야하고 std::weak_ptr들이 해당 std::shared_ptr들보다 더 오래 살아남는 경우

C++ 2023.09.28

std::unique_ptr & std::shared_ptr & std::weak_ptr

● std::unique_ptr 1. 독점 소유권 의미론을 가진 자원의 관리를 위한, 작고 빠른 이동 전용 포인터 2. 기본적으로 자원 파괴는 delete를 통해 일어나나, 커스텀 삭제자를 지정할 수 있다. 상태 있는 삭제자나 함수 포인터를 사용하면 std::unique_ptr 객체의 크기가 커진다 : 함수포인터를 사용하면 해당 포인터의 크기만큼 크기가 증가 : 갈무리 없는 람다표현식에서는 크기 증가가 없다 3. std::unique_ptr를 std::shared_ptr로 손쉽게 변환할 수 있다 ● std::shared_ptr 1. std::shared_ptr은 임의의 공유자원의 수명을 편리하게 관리할 수 있는 수단을 제공 2. 대체로 std::shared_ptr 객체는 그 크기가 std::unique_..

C++ 2023.09.28

explicit & 특수 멤버 함수

● explicit : 암시적 형변환을 허용하지 않을 때 사용 ex) Mystring s1 = Mystring(5); Mystring s2 = 5; : 암시적 형변환 진행, int 타입을 받는 생성자를 호출, explicit가 없는 경우 explicit 생성자에서는 복사초기화는 사용할 수 없지만 직접 초기화는 사용할 수 있다. ● 특수 멤버 함수 1. 컴파일러가 스스로 작성할 수 있는 멤버 함수들, 즉 기본생성자와 소멸자, 복사연산들, 이동연산들을 가리켜 특수 멤버함수라고 부른다 2. 이동 연산들은 이동연산들이나 복사 연산들, 소멸자가 명시적으로 선언되어 있지 않은 클래스에 대해서만 자동으로 작성 : 이동연산, 복사연산, 소멸자의 명시적 선언 및 정의는 자동작성 함수들이 사용에 부적합하다는 뜻이므로 하나..

C++ 2023.09.28

noexcept & constexpr

● noexcept 1. 함수 인터페이스의 일부, 이는 호출자가 noexcept여부에 의존할 수 있음을 뜻한다 2. noexcept 함수는 비 noexcept함수보다 최적화의 여지가 크다 3. noexcept는 이동 연산들과 swap, 메모리 해제 함수들, 그리고 소멸자들에 특히 유용 4. 대부분의 함수는 noexcept가 아니라 예외에 중립 ※ noexcept은 강한 예외 보장을 하는데 이동 연산시 예외 보장이 안될 경우 복사를 진행하므로 이동 연산의 이점을 제대로 활용하고자하면 이동 생성자에 예외보장(noexcept)을 선언해줘야한다. ● constexpr 1. constexpr 객체는 const이며, 컴파일 도중에 알려지는 값들로 초기화 된다 : 상수가 된다는 뜻 2. constexpr 함수는 그 ..

C++ 2023.09.28

enum/enum class

enum은 범위없는 enum enum class는 범위 있는 enum ex) enum color = {black, white, red} auto white = false -> enum의 white와 중복에러 -> enum에 속한 이름이 밖으로 새어나감 범위 없는 enum의 열거자들은 암묵적으로 정수형식으로 변환, 그리고 정수형식으로부터 암묵적으로 부동소수점 형식으로 변환 enum class는 다른 형식으로 변환하고 싶으면 캐스팅을 사용 enum class의 바탕형식은 기본적으로 int, 기본형식이 마음에 들지 않는다면 다른 형식으로 명시적 지정가능 ex) enum class status : std::uint32_t {}; enum에는 기본 바탕형식이 없어 구성을 보고 컴파일러가 선택 enum class는..

C++ 2023.09.28

auto & 중괄호 초기화 & nullptr

auto : 타이핑 수, 형식 연역에서 이점이 있음. 단, 대리자 형식을 반환하는 경우에는 예기치 않은 동작을 함. 이때 대리자 형식 반환 사용여부의 확인 후 강제 형 변환진행 ex) bool형 1bit에 true/false값이 담기지만 C++에서는 1bit를 다룰 어떠한 문법도 지원하지 않기때문에 어쩔 수 없이 대리자 형식을 반환 중괄호 초기화 Widget w3(); -> Widget 생성자가 아니라 함수선언이 되어버림 Widget w3{}; -> 중괄호 초기화로 위 상황 회피 std::initializer_list를 이용한 생성자가 있을 경우에 중괄호 초기화가 가능한 것은 아님 모든 생성자에 중괄호/괄호의 구분 없이 사용가능. 단, std::initializer_list를 이용한 생성자가 존재할 시 ..

C++ 2023.09.28