목록C++ (72)
나만의 작은 도서관
나는 vector가 있는데 왜 불편한 C 배열을 쓰고 싶어 할까?vector라는 좋은 게 있는데 왜 C 배열을 쓰고 싶어지는 이유는 크게 두 가지 정도 있는 것 같다.첫 번째는 C 배열이 vector보다 가독성이 높다는 점이다. 개인적으로 vector와 같이 적는 것보단 int arr[5]와 같이 적는 게 훨씬 눈에 잘 들어왔다. 그래서 vector >와 같이 꺾쇠 지옥에 시달리다 보면 int arr[5][5]와 같은 문법이 그리워지곤 한다.두 번째는 고정된 크기임을 명시하고 싶을 때이다. vector는 기본적으로 크기 조절을 막을 수 있는 방법이 없다. 그래서 고정된 크기로 쓸 vector는 계속 머릿속으로 ‘이 vector는 고정 크기다’라는 생각을 하고 있어야 되는데 이게 너무 귀찮았다. 물론 st..
std::copy란?template OutputIt copy(InputIt first, InputIt last, OutputIt d_first);std::copy란 지정한 범위의 메모리를 복사하여 다른 위치에 붙여 넣는 함수로, 3개의 iterator를 인자로 받으며 [first, last) 범위의 메모리를 복사하여 d_first부터 붙여 넣는다.다른 STL Algorithm 함수들과 동일하게 last 위치는 범위에 포함시키지 않기 때문에 std::copy의 last 위치의 메모리가 복사 범위에 들어가지 않음을 유의해야 한다.std::copy를 사용할 수 있는 범위가 굉장히 넓지만, 제목에서 알 수 있듯 자주 사용되는 상황은 vector 부분 복사이다. 예제는 아래와 같다.vector v1 = {1, 2..
주의사항: 해당 글은 다듬지 않은 날것 그대로인 글입니다. 이슈의 배경: LinkedList 구현자주 사용하지 않았던 LinkedList의 개념을 확실히 잡고자 STL에서 제공하는 list를 사용하지 않고 이중 연결 리스트(Doubly Linked List)를 직접 구현하고 있던 상황이었다. 새로운 원소를 삽입하기 위해서 Insert 함수를 구현하고 있었는데, 이상하게도 방금 만든 Node가 연결 작업을 하지 않았는데도, 이미 LinkedList에 있는 노드와 연결되어 있던 것이다. Insert 함수의 코드는 아래와 같다.Node* Insert(Node* cursor, T data){ Node* newNode = new Node(data); // 여기서 cursor의 prev로 newNode가 ..
주의사항: 해당 글은 다듬지 않은 날것 그대로인 글입니다. 쓰레기 값이란?쓰레기 값이란 초기화되지 않은 메모리에 들어있는 값을 의미한다. 예를 들어, int a; 와 같이 변수를 선언만 하고 값을 초기화하지 않았다면, a에는 쓰레기 값이 들어있게 된다.int a;cout 물론, 전역 변수와 정적 지역 변수(static)는 사용자가 초기화를 따로 하지 않아도 자동으로 초기화되기 때문에 쓰레기값 대신 기본값이 들어있게 된다. 그렇기에 전역 변수와 정적 지역 변수는 오늘 다룰 주제에서 제외된다. struct나 class의 멤버 변수의 쓰레기 값struct나 class가 들고 있는 멤버 변수들은 객체가 생성될 때 자동으로 초기화될까?그렇지 않다. struct나 class의 멤버 변수도 기본 타입(int나 flo..
개요컴파일러는 컴파일 단계에서 소스 코드를 목적 코드(예: .obj, .o 파일)로 변환하여, 이후 단계인 링커 단계에서 링커가 사용할 수 있도록 한다. 이 목적 코드에는 크게 두 가지 핵심 요소가 포함되는데, 첫 번째 요소로는 실행 가능한 기계어 수준의 “명령어”, 두 번째 요소로는 링커가 코드 조각들을 연결할 때 참조하는 “심볼 테이블”이다. 이 중 심볼 테이블은 외부 또는 내부 심볼을 식별하고 연결하는 데 필요한 정보를 담고 있으며, 이를 이해하려면 먼저 심볼(symbol)이라는 개념을 정확히 파악할 필요가 있다. 따라서, 이 글에서는 심볼이 무엇인지, 그리고 어떤 종류의 심볼이 존재하는지 살펴본다. 이어서, 컴파일러가 심볼을 심볼 테이블에 추가할 때 사용하는 저장 방식 지정자(storage cla..
개요컴파일 단계는 프로그래밍 언어로 된 코드를 기계어로 변환하는 과정이다. 이 과정을 수행하는 컴파일러는 ODR(One Definition Rule, 유일 정의 규칙)이라는 정해진 규칙을 준수하는데, 이러한 ODR을 이해하기 위해 필요한 개념이 바로 번역 단위와 선언과 정의이다.이 글에서는 컴파일 과정에서 준수하는 ODR이라는 규칙을 이해하기 위해 번역 단위가 무엇인지, 선언과 정의가 어떻게 구분되는지, 그리고 마지막으로 ODR 정의에 대한 해석을 간단하게 다룬다.번역 단위(translation unit)번역 단위(이하 TU)란 하나의 소스 파일(.cpp)이 전처리 단계를 거친 후에 생긴 결과물을 의미하며, 컴파일러가 소스 파일(.cpp)을 처리하는 단위이다.즉, TU는 #include, #define과..