일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 파일시스템 구현
- 쓰레드
- 그리디 알고리즘
- 디자인패턴
- OS
- 락
- 멀티프로세서
- 영속성
- 다이나믹 프로그래밍
- Direct12
- 컨디션 변수
- DirectX12
- I/O장치
- DirectX 12
- 병행성
- directx
- 자료구조
- 알고리즘
- 백준
- 타입 객체
- 병행성 관련 오류
- 그리디알고리즘
- 프로그래머스
- 스케줄링
- 렌더링 파이프라인
- 멀티쓰레드
- 다이나믹프로그래밍
- codility
- 운영체제
- 동적계획법
- Today
- Total
목록분류 전체보기 (500)
기록공간
decltype 키워드는 표현식을 인자로 받아서 그 표현식의 결과 타입이 무엇인지 알아낸다. 예를 들면 다음 코드에서 int x = 123; decltype(x) y = 456; 컴파일러는 x가 int 타입이라는 사실로부터 y의 타입을 int로 연역한다. 새로운 함수 문법에서 auto 키워드와 마찬가지로 decltype도 처음 볼 때는 어떤 효용이 있는지 잘 보이지 않는다. 하지만 템플릿 코드를 작성할 때는 auto와 decltype 키워드가 큰 역할을 한다.
C++14에서는 컴파일러가 리턴 타입을 자동으로 결정하게 할 수 있다. 이 기능을 사용하려면 리턴 타입에 auto 키워드를 사용하고 리턴 타입 지정을 생략한다. auto divideNumbers(double numerator, double denominator) { if(denominator == 0) {...} return numerator / denominator } 리턴 타입을 auto로 해두면 return 문의 표현식이 어떤 타입을 가지느냐에 따라 리턴 타입이 자동으로 결정된다. 함수 안에 return 문이 여럿 존재할 경우 모든 return 문의 표현식이 항상 같은 타입으로 결정될 수 있어야 한다. auto 리턴 타입은 재귀 함수에도 사용할 수 있으나 첫번째 return 문은 반드시 재귀 호출이..
C++11 부터는 리턴 타입이 함수 선언문 뒤에 따라오는 '새로운 함수 정의 문법'을 추가적으로 도입하고 있다. 이 문법은 리턴 타입을 함수 원형 뒷부분에 표기하는데, 보통의 경우에는 사용할 일이 없다. 하지만 템플릿 함수에는 매우 유용하다. 다음 예제는 새로운 함수 정의 문법을 따르고 있다. 함수 정의 앞에 오는 auto 키워드는 이 함수의 정의가 새로운 문법을 따른다는 것을 의미한다. auto func(int i) -> int { return i + 2; } 리턴 타입이 함수 앞에 오는 대신 ㅅ화살표 뒤에 지정되었다. 다음 코드를 보면 함수 정의 문법은 달라졌지만 함수 호출 방법은 기존과 동일하며, main() 함수도 새로운 문법으로 정의할 수 있다는 것을 알 수 있다. auto main() -> i..
배열 타입은 C언어에서 유래한 것으로 C++에서도 계속 사용하고 있다. C++에서는 std::array라는 새로운 형태의 컨테이너가 있다. std::array는 헤더 파일에 정의되어 있다. std::array는 C언어 배열을 대체하는 안전한(범위를 벗어난 메모리 작업의 위험이 없는) 배열 타입이다. std::array가 도입되기 전에는 std::vector를 사용해야 했다. std::array는 std::vector와는 다르게 크기가 고정되어 있어 새로 항목을 추가하거나 삭제할 수는 없지만 오버헤드가 적은 장점이 있다. std::array는 기존 C언어 배열에 대한 아주 가벼운 레퍼 클래스로 기존 배열에 비해 몇 가지 장점이 있다. 우선 배열의 크기를 항상 정확히 알 수 있고, 포인터가 자동으로 잘못 타..
열거 타입은 타입 세이프하지 않다. 기본적으로 정수 타입 취급을 받기 때문에 서로 완전 별개인 열거 타입 간에도 비교 연산이 가능하다. enum class를 이용하면 이러한 문제를 해결할 수 있다. 다음은 사용 예이다. enum class MyEnum { EnumValue1, EnumValue2 = 10, EnumValue3 }; MyEnum은 타입 세이프하기 때문에 열거값이 다른 정수 타입 변수로 자동으로 캐스팅되지않고 class 이름으로 스코프 설정을 하지 않으면 참조할 수도 없다. 다음과 같이 스코프 설정을 해야 사용 가능하다. MyEnum value1 = MyEnum::EnumValue1 다음과 같이 일반 정수값과 MyEnum 값을 비교하는 것은 문법 위반이다. if(MyEnum::EnumValu..

지금까지 살펴보았던 내용들은 가상 주소 공간이 비현실적으로 작아서 모두 물리 메모리에 탑재가 가능했다. 만약 가상 주소 공간이 큰 프로세스들 여러 개를 실행한다면 물리 메모리는 더 이상 할당을 받을 수 없으므로 문제가 생길 것이다. 이 문제를 완화하기 위해서 메모리 계층의 추가가 필요하다. 느리지만 매우 큰 용량의 메모리를 사용하는 것이다. 시스템에서 이 역할을 하드 디스크 드라이브가 담당한다. 이제 메모리 계층에서 크고 느린 하드 디스크 드라이브가 가장 하부에 위치하고, 그 위에 메모리가 있다. 왜 굳이 "큰" 주소 공간이 필요한 것일까? 이에 대한 답은 편리함과 사용 용이성이다. 주소 공간이 충분히 크면, 충분한 메모리 공간이 있는지 걱정하지 않아도 된다. 그냥 운영체제에게 요청하기만 하면 된다. 스..

컴퓨터에서는 우선순위 개념이 종종 필요할 때가 있다. 예를 들면, 운영 시스템에서 시스템 프로세스는 응용 프로세스보다 더 높은 우선순위를 갖는다. 따라서 자료구조에서도 이러한 우선순위를 지원하는 것이 필요하다. 우선순위 큐는 이러한 우선순위의 개념을 큐에 도입한 자료구조이다. 보통의 큐는 먼저 들어온 데이터가 먼저 나가는 구조(FIFO)인데 비해, 우선 순위 큐는 모든 데이터가 우선순위를 가지고 있고, 들어온 순서와 상관없이 우선순위가 높은 데이터가 먼저 출력되는 구조다. 우선순위 큐는 사실 가장 일반적인 큐로 볼 수 있다. 이것은 우선순위 큐를 사용하여 스택이나 큐를 얼마든지 구현할 수 있기 때문이다. 예를 들어 데이터가 들어온 시점 기준으로 빠른 것을 높은 우선순위로 잡으면 큐처럼 동작하고, 반대로 ..

페이징의 또 다른 문제점은 페이지 테이블의 크기이다. 페이지 테이블이 크면 많은 메모리 공간을 차지한다. 이전에 배열 형태를 가지는 선형 페이지 테이블(linear page table)을 예로 들어 페이지 테이블이 얼마나 많은 메모리 공간을 차지하는지 살펴보았다. (페이지 테이블이 100개 존재한다고 가정하면 무려 400MB의 메모리가 필요했었다!) 이러한 메모리 부담을 해결할 수 있는 기술을 모색해 보자. 간단한 해법 : 더 큰 페이지 페이지 테이블 크기를 간단하게 줄일 수 있는 방법이 한 가지 존재한다. 페이지 크기를 증가시키면 된다. 32비트 주소 공간에서, 이번에는 16KB 페이지를 가정해 보자. 이제는 18비트의 VPN과 14비트의 오프셋을 갖게 된다. 각 PTE의 크기(4KB)가 모두 동일하다..