목록전체 글 (65)
Ggulpy's Develop
안녕하세요~좋은 아침이에요오늘은 () 연산자의 오버로딩과 중요한 개념 중 하나인 펑터에 대해 살펴볼겁니다! 1. () 연산자의 오버로딩과 펑터(Functor) 함수의 호출 시 사용되는 () 연산자 역시 오버로딩이 가능한 연산자이다. 해당 연산자를 오버로딩 시, 객체를 함수처럼 사용하는 것이 가능하다. 객체를 함수처럼 사용한다는 것이 정확히 무엇인지 알기 위해 다음 예시를 보자. adder(2,4);adder.operator()(2,4); adder 라는 객체의 멤버 함수로 operator() 함수를 오버로딩한 상태라면, 위와 같이 adder(2,4) 를 해석할 수 있다. 그리고 이렇게 함수처럼 작동하는 객체, 즉 클래스를 '펑터(Functor)' 혹은 '함수 오브젝트(Function Object)' 라..
안녕하세요~ 여러분오늘은 포인터 연산자의 오버로딩에 대해 공부한 후에스마트 포인터에 대해 가볍게 알아보도록 합시다! 1. 포인터 연산자 오버로딩포인터를 기반으로 하는 모든 연산자를 포인터 연산자라고 하는데 대표적으로 다음 두가지 연산자가 있다. -> : 포인터가 가리키는 객체의 멤버에 접근* : 포인터가 가리키는 객체에 접근 두 연산자는 거의 비슷하고 사용시 약간의 차이만 있다. 다음 예제를 통해 포인터 연산자의 오버로딩 방식을 살펴보자. class Number {private: int num;public: Number(int n) : num(n) {} void ShowData() { cout () { return this; } Number& operator*() { return *this; }}..
안녕하세요! 여러분오늘은 new 연산자와 delete 연산자의 오버로딩에 대해살펴보도록 해요~ 1. new, delete 연산자new와 delete 연산자가 하는 역할에 대해 먼저 살펴보자. *new 연산자의 역할:1. 메모리 공간의 할당2. 생성자의 호출3. 할당하고자 하는 자료형에 맞게 반환된 주소 값의 형 변환 기존에 new 연산자의 역할은 이러한데 실제로 new 연산자 오버로딩 시에 이러한 역할 전부를 구현해줄 필요는 없다. C++ 컴파일러가 생성자의 호출(2번)과 할당하고자 하는 자료형에 맞게 반환딘 주소 값의 형 변환(3번)을 책임지기 때문이다. 그렇다면 남은 것은 1번, 메모리 공간의 할당이다. 즉 new 연산자 오버로딩 시에는 메모리 공간의 할당만 오버로딩할 수 있는 것이다. 오버로딩은 ..
안녕하세요~오늘은 불연속 할당 방식 중 세그먼테이션 방법과페이지드 세그먼테이션 방법에 대해 알아볼게요! 1. 세그먼테이션(Segmentation) 기법: 하나의 프로세스를 구성하는 주소 공간은 일반적으로 코드(code), 데이터(data), 스택(stack) 등의 의미 있는 단위들로 구성되는 이처럼 주소 공간을 기능 단위 또는 의미 단위로 나눈 것을 뜻한다. 페이징 기법과 달리, 크기가 균일하지 않은 의미 단위로 나눈 것이기 때문에 크기가 균일하지 않은 세그먼트들을 메모리에 올리는 부가적인 관리 오버헤드가 뒤따른다. (1) 세그먼테이션 기법 구성 요소 1. 먼저 아래 그림에서 볼 수 있듯, 논리적 주소는 로 구성된다. (s: 해당 프로세스 내에서 몇번째 세그먼트에 속하는지/ d: 그 세그먼트 내에서..
안녕하세요~여러분오늘은 배열의 인덱스 연산자 오버로딩에 대해알아볼겁니다! 1. 배열 클래스 우리는 이미 배열 연산자를 써서 배열의 요소에 접근하고 있다. A[0], A[1], A[2], A[-1] ...이렇게 말이다. 그렇다면 배열 인덱스 연산자 오버로딩이 필요한 이유는 무엇일까?우리는 가끔 배열의 사이즈를 넘어서는 인덱스에 접근하려고 할 때 vector outof range 경고를 받아보았을 것이다. 이러한 배열 접근의 안전성을 보장하고 배열의 복사 또는 대입을 원천적으로 막기 위해 다음과 같이 배열 인덱스 연산자를 오버로딩한다. 참고로 배열 인덱스 연산자는 멤버함수 기반으로만 오버로딩할 수 있다. typedef Point* POINT_PTR;class BoundCheckPointPtrArray {..
안녕하세요~오늘은 지난 시간에 이어페이징기법에 대해 마저 살펴보도록 할게요! 1. 계층적 페이징페이지 테이블에 사용되는 메모리 공간은 어느 정도일까?예) 32비트 주소 체계를 사용하는 컴퓨터에서는 예를 들어, 2^32 byte (4GB) 의 주소 공간을 갖는 프로그램을 지원할 수 있다. 이러한 환경에서 페이지 크기가 4KB라면 4GB/4KB = 1M 개의 페이지 테이블 항목이 필요하다. 각 페이지 테이블 항목이 4byte씩을 필요로 한다면 한 프로세스당 페이지 테이블을 위해 1M*4byte = 4MB 크기의 메모리 공간이 필요한 것이다. 즉 대부분의 프로세스는 4GB의 주소 공간 중 극히 일부만 사용하기 때문에 페이지 테이블을 위한 4MB는 상당한 메모리 공간 낭비이다. -> 페이지 테이블에 사용되는 ..
안녕하세요~여러분오늘은 지난 시간에 이어물리적 메모리 관리 방식 중 하나인불연속 할당 방식에 대해 알아보겠습니다~ 1. 불연속 할당 기법의 종류불연속 할당 기법은 하나의 프로세스가 물리적 메모리의 여러 위치에 분산되어 올라갈 수 있는 메모리 할당 기법을 말한다. 불연속 할당 기법은 하나의 프로그램을 분할하는 기준에 따라 세가지 종류로 나뉜다. 페이징 기법: 프로세스를 동일한 크기로 나누어 메모리에 올림.세그먼테이션 기법: 크기는 일정하지 않지만 의미 단위(코드, 데이터, 스택)로 나누어 메모리에 올림.페이지드 세그먼테이션 기법: 세그먼텐이션을 기본으로 하되 이를 다시 동일 크기의 페이지로 나누어 메모리에 올림. 2. 페이징(Paging) 기법프로세스의 주소 공간을 동일한 크기의 페이지 단위로 나누어 물..
안녕하세요~ 여러분오늘은 물리적 메모리 할당 방식 중에서연속할당 방식에 대해 먼저 살펴볼거예요! 1. 연속할당 방식사용자 프로세스 영역의 관리 방법으로 프로세스를 메모리에 올리는 방식에는 각각의 프로세스를 나누지 않고 연속적인 메모리 공간에 올리는 연속할당 방식과 하나의 프로세스를 나누어 분포시키는 불연속 할당 방식이 있다. 이때 연속할당 방식은 고정분할 방식과 가변분할 방식으로 나누어볼 수 있다. 2. 고정분할 방식고정분할 방식은 물리적 메모리를 주어진 개수만큼의 영구적인 분할(partition)로 미리 나누어두고 각 분할에 하나의 프로세스를 적재해 실행시키는 것이다. *고정분할 방식의 문제점 :외부조각 문제 (external fragmentation) : 프로그램의 크기보다 분할의 크기가 작..
여러분 안녕하세요!오늘은 대입연산자의 오버로딩에 대해 배워볼겁니다!앞서 배웠던 복사생성자와 비교하며 알아볼거예요~ 1. 복사 생성자와 대입 연산자앞서 복사 생성자에 대해 공부하면서 다음과 같은 복사 생성자의 특성을 이해한 적이 있다. - 따로 정의하지 않으면 디폴트 복사 생성자가 삽입된다.- 디폴트 복사 생성자는 멤버 대 멤버의 복사(얕은 복사)를 진행한다.- 생성자 내에서 동적 할당을 한다면, 그리고 깊은 복사가 필요하다면 직접 정의해야 한다. 대입 연산자 역시 위의 특성을 그대로 갖고 있다. 하지만 복사 생성자와 '호출 시점'에서 차이를 가지고 있다. 다음 예시 코드를 살펴보자. int main(){ Point pos1(5,7); Point pos2 = pos1;}-> 복사 생성자를 통..
안녕하세요~ 여러분오늘은 메모리 관리에 대해 알아볼겁니다!먼저 주소 바인딩 개념에 대해 알아보고, 메모리 관리에 관련된 용어 몇가지에 대해 살펴볼겁니다~ 1. 주소 바인딩 개념프로그램이 실행되기 위해서는 해당 프로그램이 물리적 메모리에 올라가 있어야 한다. 각 프로세스는 독자적으로 논리적 주소(logical address / virtual address) 를 갖는데 프로세스의 논리적 주소를 물리적 주소로 연결시켜주는 작업을 주소 바인딩(address binding) 이라고 한다. - by 프로그램이 적재되는 물리적 메모리의 주소가 결정되는 시기1. 컴파일 타임 바인딩 (compile time binding): 물리적 메모리 주소가 프로그램을 컴파일할 때 결정되는 주소 바인딩 방식.-> 물리적 메모리..