갬장장이
'lang/c++' 카테고리의 글 목록 (2 Page)

lang/c++

lang/c++

ceil floor round (#include <cmath>)

ceil -> 4.2를 5로 floor -> 4.2를 4로 round -> 4.2를 4로, 4.5를 5로

lang/c++

std::set의 iteration

iterator를 사용한다. 이 때 set.end()가 마지막 원소 다음을 가리킨다는 점에 유의하자. 따라서 for (std::set::iterator i = set.begin(); i != set.end(); ++i) 처럼 사용하면 된다. (auto가 더 편하긴 하다)

lang/c++

동적 바인딩 혹은 늦은 바인딩이란(Dynamic binding)

동적 바인딩(늦은 바인딩)이란? 컴파일 단계에서 변수/함수의 메모리 주소가 결정되는 것을 이른 바인딩(Early binding)이라고 한다. 이와 반대로 컴파일 이후 프로그램 실행 도중에 변수/함수의 메모리 주소가 결정되는 것을 동적 바인딩(Dynamic binding)이라고 한다. #include using namespace std; void TestFunc() { cout

lang/c++

Virtual 키워드의 세부적인 작동 원리 - 함수 포인터와 Vtable

함수 포인터란? 말 그대로 함수를 가리키는 포인터이다. 코드를 통해 사용방법을 설명하겠다. void PrintNumber(int n) { std::cout Vtable 값에는 Apple::Hello()를 가리키는 함수 포인터가 저장된다. 그리고 *apple->__vfptr은 기존에 가리키던 Vtable 대신 새로 생긴 Vtable을 가리킨다. 이러한 과정을 거친 후 apple->Hello()를 실행하면 Vtable에 저장된 데이터를 통해 우리가 실행해야 하는 함수가 Apple::Hello()라는 것을 알 수 있고, 덕분에 virtual 키워드가 정상적으로 작동하게 되는 것이다.

lang/c++

STL Set의 메모리 구조

1,2,3,4,5를 저장한 STL Set은 메모리에 다음과 같은 형태로 저장되어있다. 이처럼 STL Set은 BST(Binary Search Tree)를 이용해 정보를 저장한다. 여기서 중요한 점은 다음과 같다. 1) find, insert, delete의 경우 모두 O(log n)의 time complexity를 갖는다. (이때 insert와 delete의 경우 트리 자체를 새로 생성해야 하는 상황이 발생할 수도 있다.) 2) Set은 데이터를 정렬된 형태로 출력할 수 있는데, 이는 트리 구조를 가지는 Set의 특성 상 데이터 출력시 트리 순회를 통해서 순서를 정렬해서 출력할 수 있기 때문이다.

lang/c++

STL Vector에 클래스를 저장할 때 발생하는 일들

다음과 같은 클래스가 있다고 가정해보자. #include #include class Coor { public: int x; int y; public: Coor(int x, int y) : x(x), y(y) { std::cout

lang/c++

STL Vector의 메모리 구조

1, 2, 3, 4 를 저장한 v라는 이름의 STL 벡터가 있다고 가정했을 때, 이 벡터는 메모리 상에서 다음과 같은 구조를 가진다. 여기서 중요한 점은 다음과 같다. 1) 벡터는 정보를 메모리 상에서 연결된 형태로 일렬로 저장한다. 때문에 벡터는 Random Access의 Time Complexity가 O(1)이다. 또 이 일렬로 순서대로 저장한다는 점 때문에, 벡터에서 n번째 위치에 요소를 추가/제거하려면 O(n)이 소요된다. 2) 벡터가 차지하는 공간(capacity)과 그 속에 저장되어있는 요소의 갯수(size)는 다르다. 벡터의 요소의 갯수(size)가 벡터가 보유한 공간(capacity)을 넘어서면 메모리의 다른 공간으로 요소 전체를 복사시키고, 원본은 삭제한다. 이 과정을 reallocati..