전체 글 169

[C++] 람다 식 (Lambda)

[ 목차 ] 1. 람다 표현식 C++에서는 '호출할 수 있는 객체'를 callable이라고 말합니다. 그 종류는 총 5개 1) std::function 2) 함수 포인터 3) operator() 4) bind에서 나온 타입 (아직 다루지 않은 내용) 그리고 lambda 람다식입니다. 새로운 '호출성 객체'라고 하죠, 람다는 다른 언어에서는 익명함수, 무명함수라고 말하며 기능적으로는 '재활용하지 않는 일회용 함수'라고 말합니다. 이름이 없고, 필요할 때 딱 만들어서 쓰고 버리는 함수라고 할 수 있죠. 예시는 아래와 같습니다. 즉석 해서 함수를 정의한다고 보면 되겠습니다. 이런 식으로 람다 변수로 초기화해서 호출하는 방법도 있고, 바로 호출하고 버리는 방법도 있고, 매개변수로 넘기는 방법도 있습니다. 더 다..

언어/C, C++ 2024.01.19

[C++] 스마트 포인터 - 2 (shared_ptr, weak_ptr)

[ 목차 ] 이전 포스팅 https://powerclabman.tistory.com/48#6._%EB%A7%88%EC%B9%98%EB%A9%B0 [C++] 스마트 포인터 - 1 (unique_ptr, unique_ptr 역설계) [ 목차 ] 1. 동적 메모리 C++에서 동적 메모리는 new로 할당하고 delete로 해제합니다. new는 객체를 할당하고 초기화하여 그 객체에 대한 포인터를 반환하고 delete는 소멸하며 할당한 메모리를 해제하 powerclabman.tistory.com 따로 복습을 위한 서술은 없습니다. 1. shared_ptr shared_ptr 은 본격적으로 자동 메모리 관리를 하기위한 포인터입니다. 내부에는 ptr 과 control_block 이 존재하고, ptr은 객체를 참조하기위..

언어/C, C++ 2024.01.18

[C++] 스마트 포인터 - 1 (unique_ptr, unique_ptr 설계)

[ 목차 ] 1. 동적 메모리 C++에서 동적 메모리는 new로 할당하고 delete로 해제합니다. new는 객체를 할당하고 초기화하여 그 객체에 대한 포인터를 반환하고 delete는 소멸하며 할당한 메모리를 해제하죠. C++ 스타일의 동적 메모리는 Java, C#에 비해 빠르지만 큰 단점이 있는데, 메모리의 할당과 해제를 모두 프로그래머에게 맡긴다는 것입니다. 말로만 들어도 위험하죠? 객체를 생성했으면, 반드시 해제해 줘야 문제가 생기지 않는다는 건데, 이게 말처럼 쉽지 않습니다. 위와 같은 코드가 있다고 가정합니다. 함수 func에서 MyClass 메모리를 할당하고, 나중에 해제하려도 시도는 하고 있지만, 중간에 return을 만나서 함수가 종료되어 버리면, 그대로 메모리 누수가 일어나는 거서입니다...

언어/C, C++ 2024.01.17

[C++] 오른값 참조, 이동 연산자, 이동 대입 연산자

[ 목차 ] 1. 왼값 vs 오른값 왼값(l-value), 오른값(r-value)에 대해 알고 계신가요? 아마 처음 들어보실 수도 있는데, 이렇게 생각하시면 편합니다. 왼값: 데이터를 저장할 수 있는 값, 지속되는 값 오른값: 일시적인 값, 임시적인 값 아직 잘 모르겠죠? 식이 있을 때 좌항을 왼값, 우항을 오른값이라고 이해하시면 기본적인 이해는 가능합니다. (왼값에 왼값을 넣을 수도 있어서 맞는 설명은 아닙니다.) 오른값에 특정한 값을 집어넣는 것은 불가능합니다. 10 = num; 과 같은 코드가 상식적으로 이해되지는 않죠. 일단 오른값에 대한 기본 개념은 이 정도로 이해하시고 넘어가시면 되겠습니다. 왼값: 주소를 가지는 변수, 값을 저장할 수 있는 변수, 지속되는 값 오른값: 상수나 일시적인 값들, ..

언어/C, C++ 2024.01.16

[C/C++] 함수 포인터, 함수 객체, std::function

함수 포인터 혹시 함수를 cout이나 printf에 넣어본 적 있나요? 매개변수를 집어넣지 않은 순수한 함수 그 자체를 출력하면 매우 이상한 값이 출력됩니다. 이 숫자가 뜻하는 바가 무엇인지 아시겠나요?/ 이는 함수가 존재하는 '주소'를 뜻하는 겁니다. 함수 역시 다른 데이터들과 마찬가지로 메모리에 저장되죠. 이 메모리 스택 중에 함수는 '코드 영역'에 저장되어 메모리상에 존재합니다. 출력된 내용은 코드 영역에 함수가 저장된 주소라고 할 수 있는 것이죠. 그러면, 함수의 주소를 가지고 여러 가지 장난을 칠 수도 있을까요? 물론 가능합니다. 이것을 가능하게 해주는 것이 함수 포인터입니다. 함수 포인터를 어떻게 선언하는지, 함수를 가리키기 위해서는 어떻게 해야 하는지 알아봅시다. 저도 여전히 조금 헷갈리는 ..

언어/C, C++ 2024.01.16

[C++] 템플릿 기본

개론 템플릿 문법은 일반화 프로그래밍에 사용되는 문법입니다. C++의 컨테이너, 반복자, 알고리듬 모두 일반화 프로그래밍의 일종이죠 일반화 프로그래밍이란, '일반화 정의'를 사용해 다양한 타입의 형태를 만들어서 사용할 수 있는 것을 뜻합니다. C의 void* 문법과 비슷하다고 볼 수 있으나 템플릿 문법은 훨씬 사용하기 쉽고 다양한 기능을 제공합니다. (템플릿 문법이 사용하기는 쉽지만, 매우 다양한 문법을 지원합니다. 그래서 깊이 파면 공부할 양이 상당히 많은 문법입니다.) 흔히, 템플릿은 '청사진을 만든다.'라고 비유하기도 하는데요. 말 그대로 청사진을 만들어서 원하는 형태로 변형시켜서 사용할 수 있습니다. 이러한 변형은 컴파일 시간에 발생합니다. 함수 템플릿과 클래스 템플릿 1. 함수 템플릿 a, b를..

언어/C, C++ 2024.01.15

시간이 부족한 사람을 위한 스트렝스 트레이닝 가이드

운동에 대한 조금의 사전지식이 필요한 글이니 유의해주세요. 모르는 용어는 검색하시면 금방 나올겁니다. 저도 사회생활을 하고 전공도 이쪽이 아닌지라 운동에 투자할 시간이 부족할 때가 많습니다. 이런 운동 시간 부족은 많은 사람들이 겪는 흔한 문제죠. 항상 운동을 최우선 순위에 두기는 어렵잖아요? 이번 글에서는 바쁜 삶 속에서 효과적으로 스트렝스 트레이닝을 구성하는 방법에 대해서 소개하겠습니다. 1. 운동을 잠시 쉬는 것은 어떤 영향을 미칠까? 종종 운동을 잠시 중단하는 것이 큰 손실을 가져다 줄 것이라는 생각이 만연하지만, 단기간(1주일 언저리) 정도 훈련을 '완전 중단'하는 것은 큰 문제가 되지 않습니다. 심지어는 긴 시간동안 강도 높은 훈련 섹션을 유지해왔다면 1주일 간의 짧은 휴식은 오히려 최대 근력..

전통적인 Deload를 대체하는 Pivot Week

Pivot 주 혹은 Pivot Block (이하 피봇) 이라는 것은 RTS (Reactive Training System) 이라하는 훈련 메소드에서 등장하는 개념입니다. 흔히 말하는 '디로드'와 목적을 어느정도 공유하며 대체하여 진행할 수 있습니다. 피벗을 단순히 디로드의 한 형태로 혼동하거나, 이런저런 운동 다 때려박아서 수행하는 경우가 많은데 피벗 블록을 단순 디로드로 시작하는 것은 좋으나, 더 나아가서 피봇 블록의 목표가 무엇인지, 디로드와 어떻게 다른지에 이해하고 적용시키면 더 좋은 결과가 있을 겁니다. 피봇의 목표는 디로드와 동일하게 피로를 감소시키는 것입니다. 긴 기간의 볼륨 축적, 피로토 피크에 도달하는 훈련 블록을 수행한 뒤, 혹은 대회에 나간 후에는 피로도를 감소시킬 수 있는 일련의 훈련..

[C++] 예외처리

C++ 예외 처리 C++ 에는 예외처리를 지원하긴 하지만 엄청 중요하게 다루지는 않습니다. 예외처리를 꼼꼼하게 하기는 어려울 뿐더러 예외처리는 속도가 느리기 때문이죠. 실제로 예외처리 구문에 대한 디스어셈블리를 살펴보면 코드가 엄청 많이 생성된 것을 볼 수 있습니다. C++가 속도를 중요시하는 언어인 만큼 예외 처리보다는 assert 나 if 문으로 처리하는 것이 가독성면에서나 속도면에서나 이득이라는 것이죠. 프로그래밍하면서 가장 많이 발생하는 오류는 범위 이탈(out of range)와 nullptr 참조겠죠? 이들은 모두 if 한 줄로 처리 가능합니다. 동적 할당시 메모리 부족 문제도 if 문으로 처리가 가능하구요. 그래서 대부분의 상황에서는 예외처리는 불필요할 뿐더러, 에러코드를 사용하는 방법이 더..

언어/C, C++ 2024.01.09