메모리 관리 및 저수준 자료구조 Managing Memory and low-level data structures

Slides:



Advertisements
Similar presentations
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
Advertisements

1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
C 언어 (STS ) 10. Pointer Applications.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
제 9 장 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
Part 11 문자열 ©우균, 창병모 ©우균, 창병모.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
제14장 동적 메모리.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
제 9 장 구조체와 공용체.
컴퓨터 프로그래밍 기초 [Final] 기말고사
-Part2- 제3장 포인터란 무엇인가.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
자료 구조: Chapter 3 (2)구조체, 포인터
개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
5장 배열 작성자 : 변재현.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
Chapter 10 Pointer Applications.
5장. 참조 타입.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제 3장. C보다 나은 C++ II.
C 프로그래밍.
Dynamic Memory and Linked List
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
14장. 포인터와 함수에 대한 이해.
14. 예외처리.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
11장. 1차원 배열.
C 8장. 포인터 #include <stdio.h> int main(void) { int num;
C#.
13. 연산자 오버로딩.
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
컴퓨터 개론 및 실습 11. 동적 메모리 할당.
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
제 4장. 객체 지향 프로그래밍 시작하기 학기 프로그래밍언어및실습 (C++).
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
8주차: Strings, Arrays and Pointers
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
Summary of Pointers and Arrays
Numerical Analysis Programming using NRs
Chapter 12 파일 입출력.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 05. 복사 생성자.
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
어서와 C언어는 처음이지 제21장.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
C++ Espresso 제15장 STL 알고리즘.
Pointers summary.
7 생성자 함수.
6 객체.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

메모리 관리 및 저수준 자료구조 Managing Memory and low-level data structures Chapter 10 메모리 관리 및 저수준 자료구조 Managing Memory and low-level data structures

10 장에서는… 지금까지는 10장에서는 표준 라이브러리에서 제공하는 vector 등의 컨테이너에 값을 저장했다. 표준 라이브러리의 기능이 기본 언어가 제공하는 기능보다 더 융통성 있고 사용하기 쉽기 때문… 10장에서는 기본 언어가 제공하는 저수준(lower-level) 테크닉을 공부 컴퓨터 하드웨어 동작방식과 유사 사용하기 더 어렵고 때로 위험하기도 하지만, 잘만 쓰면 때에 따라 표준 라이브러리보다 더 효율적일 수 있다. 배열과 포인터, 동적 메모리 할당, 파일에서 읽고 쓰기 등

포인터와 배열 배열 (array) 포인터와 배열은 일종의 컨테이너로서, vector와 비슷하지만 덜 강력 멤버 함수 없음 (.size() 등) 포인터 (pointer)는 일종의 임의접근 반복자 배열의 요소를 접근하는데 사용 인덱싱으로도 요소에 접근 가능 포인터와 배열은 C/C++ 의 가장 기본적인 자료구조에 해당 포인터 없는 배열은 더 이상의 존재가치가 없으며, 배열이 있어야 포인터의 유용가치도 더 커진다

포인터(pointer) 포인터: 객체의 주소(address)를 값으로 갖는 데이터 타입 모든 객체는 고유의 메모리 주소를 가지고 있다 포인터 변수 선언: int *p; // p는 정수 변수를 가리키는 포인터 주소 연산자(address operator) & x가 객체일 때, &x는 x의 주소 역참조 연산자(dereference operator) * p가 객체의 주소일 때, *p는 그 객체 자체 p=&x하면 p는 x의 주소를 갖게된다. p는 x를 가리키는(point to) 포인터라고 부름. 널 포인터(null pointer) 포인터가 상수 0 (NULL)을 값으로 가짐. 아무것도 가리키지 않는 상태. 포인터 초기화에 사용 1000 5 p x 2000 int x = 5; int *p; p = &x; cout << *p; cout << x; cout << p; cout << &x;

포인터 포인터 선언 실행 결과? int *p, q; = int* p, q; = int *p; p의 타입은 “int에 대한 포인터” 실행 결과? (*p)와 q는 int 타입을 갖는다 int *p, q; = int* p, q; = int *p; int q; int main() { int x = 5; // p points to x int* p = &x; cout << "x = " << x << endl; // change the value of x through p *p = 6; return 0; }

배열 배열은 일종의 컨테이너 예 배열의 이름은 배열의 처음 요소에 대한 포인터 표준 라이브러리가 아닌 기본 언어의 일부 배열 요소의 개수는 컴파일 시 알 수 있어야 함 동적으로 늘어나거나 줄어들 수 없음 배열의 크기를 나타내는 타입은 size_t 예 배열의 이름은 배열의 처음 요소에 대한 포인터 *coords=1.5; == coords[0]=1.5; const size_t NDim=3; double coords[Ndim]; double coords[3]; 숙련된 프로그래머

포인터 산술 연산 포인터는 임의 접근 반복자 포인터가 반복자이기 때문에, p가 배열의 m번째 요소를 가리킨다면, p+n은 m+n번째 요소를 가리킨다 p-n은 m-n번째 요소를 가리킨다 포인터가 반복자이기 때문에, coords를 벡터에 복사하기 위해서는 copy()를 이용해서 또는 벡터는 두개의 반복자를 사용해 생성할 수 있으므로, vector<double> v; copy(coords, coords+NDim, back_inserter(v)); vector<double> v(coords, coords+Ndim);

인덱싱(indexing) 포인터는 배열에 대한 임의접근반복자이므로, 인덱싱도 지원한다 p가 배열의 m번째 요소를 가리킨다면, p[n]은 m+n번째 요소이다. 즉, *(p+n)과 같다 a가 배열이라면, 배열이름은 처음요소의 주소이므로, a[n]은 배열의 n번째 요소이다. 즉, *(0+n)

배열 초기화 초기화 예 const int month_lengths[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 배열 선언시 초기화 값을 부여할 때, 배열의 크기를 명시적으로 나타내지 않아도 된다. 컴파일러가 배열 크기를 자동으로 계산해줌

문자열 리터럴 다시 살펴보기 문자열 변수 문자열 리터럴 예) 문자열의 길이를 알아내는 함수 const char hello[] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’}; 리터럴 안의 문자들의 개수보다 하나 더 많은 요소를 포함. 컴파일러는 문자열 끝에 ‘\0’를 붙여줌. 문자열이 끝나는 곳을 찾을 수 있도록 하기 위함 문자열 리터럴 hello변수와 문자열 리터럴 “Hello”는 정확히 동일한 의미를 갖지만, 변수와 문자열리터럴은 두 개의 구별되는 객체이므로, 서로 다른 주소를 갖는다. 예) 문자열의 길이를 알아내는 함수 size_t strlen(const char* p) { size_t size=0; while (*p++ != ‘\0’) ++size; return size; }

문자 포인터 배열 초기화하기 배열의 요소가 문자열인 예제 성적에 따라 학점 부여 (97이상 A+, 94이상 A, …) string letter_grade(double grade) { // range posts for numeric grades static const double numbers[] = { 97, 94, 90, 87, 84, 80, 77, 74, 70, 60, 0 }; // names for the letter grades static const char* const letters[] = { "A+", "A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D", "F" static const size_t ngrades = sizeof(numbers)/sizeof(*numbers); for (size_t i = 0; i < ngrades; ++i) { if (grade >= numbers[i]) return letters[i]; } return "?\?\?"; 각 요소가 char* 타입 (문자열)인 배열

main에 대한 인자들 main 함수도 함수이므로, 매개변수를 가질 수 있다. 실행시킬 때,인자를 주어 동작 방식을 조종할 수 있다. 실행 예: say.exe Hello, world argc: 3 int main(int argc, char** argv) { // if there are command-line arguments, write them if (argc > 1) { // write the first argument cout << argv[1]; // write each remaining argument with a space before it for (int i = 2; i != argc; ++i) cout << " " << argv[i]; // `argv[i]' is a `char*' } cout << endl; return 0;

파일 읽고 쓰기 표준 입력, 표준 출력 대신 파일에서 읽고 쓰기 많은 양의 입출력에 매우 유용 예, out.txt이라는 파일을 in.txt이라는 파일에 복사하는 프로그램 int main() { ifstream infile("in.txt"); ofstream outfile("out.txt"); string s; while (getline(infile, s)) outfile << s << endl; return 0; }

메모리 관리의 세 종류 1) 지역 변수 정의부가 실행되는 시점에 생성되고, 정의부를 포함하는 블록의 끝에서 자동으로 해제. 자동 메모리 관리. 이렇게 하면 문제 발생! if (…) { … string s; } 이때 생성되고, 블록이 끝날 때 해제 int* invalid_pointer() { int x; return &x; } 14

메모리 관리의 세 종류 2) 정적 할당 (static allocation) 처음 호출되기 전 어느 시점에 단 한번만 할당되고, 프로그램 실행 동안에 해제되지 않음 // 이 함수는 OK int* pointer_to_static() { static int x; return &x; } 15

객체 할당 및 해제 3) 동적 할당 (dynamic allocation) 예) p 42 T가 객체의 타입이라면, new T는 타입 T의 객체를 할당하라는 명령 그 객체는 디폴트-초기화: 초기화 안되거나, 디폴트 생성자 실행 새롭게 할당된 (이름 없는) 객체에 대한 포인터를 돌려줌 new T(args)하면 할당된 객체를 args로 초기화 객체를 해제할 때는, delete p; 예) int* p=new int(42); // *p는 42라는 값을 갖는 정수 객체 ++*p; // 객체의 값은 43이 된다. delete p; // 객체를 해제한다. p 42 43 16

메모리의 영역 구분 힙(heap) 영역 스택(stack) 영역 정적(static) 영역 프로그램 코드 new delete 동적 할당 힙(heap) 영역 new delete 스택(stack) 영역 지역변수 레지스터변수 정적(static) 영역 전역변수 정적변수 프로그램 코드

배열 할당 및 해제 배열 할당 예: new int[SIZE]; 예) 문자열 복사 함수 int* p=new int[1000]; // int p[1000];과 비슷 … delete[] p; // 배열을 해제한다. 예) 문자열 복사 함수 char* duplicate_chars(const char* p) { // 널 추가해야하므로 +1 size_t length=strlen(p)+1; char* result=new char[length]; // 새로 할당된 공간에 복사, 첫째 요소에 대한 포인터 리턴 copy(p, p+length, result); return result; } 18