COMPUTER
2017년 2월 1일 수요일
MSDN > Direct3D > IDirect3DDevice9 인터페이스
IDirect3DDevice9 인터페이스 메서드를 사용해
리소스 생성, 시스템 수준 변수 작업, 감마 램프 수준 조정,
팔레트 작업, 셰이더 생성등을 한다.
말 그대로 다이렉트 3D를 위한 장치(도구 상자)이다.
Remarks
IDirect3DDevice9 인터페이스는,
IDirect3D9::CreateDevice 메서드를 호출 해 얻는다.
MSDN > SetFocus 함수
키보드 포커스를 지정된 윈도우로 설정합니다.
창은 호출 스레드의 메시지 대기열에 연결되어야합니다.
매개변수
hWnd [in, 선택 사항]유형 : HWND
키보드 입력을받을 창 핸들. 이 매개 변수가 NULL이면 키 입력이 무시됩니다.
요구 사항
최소 지원 클라이언트
Windows 2000 Professional [데스크톱 응용 프로그램 만 해당]
최소 지원 서버
Windows 2000 Server [데스크톱 응용 프로그램 만 해당]
헤더
Winuser.h (Windows.h 포함)
라이브러리
User32.lib
DLL
User32.dll
2016년 5월 21일 토요일
박싱 언박싱
박싱
참조형자료형인 object 에 struct 타입의 값을 대입했을때
참조형인 object 는 struct 에 참조되는 값을 직접받을 수 없어
struct 타입과 같은 인스턴스를 힙에 할당하고
그 힙에 할당된 인스턴스를 참조한다.
이는 참조가 끊기면 가비지가 된다.
먼저 메모리 구조를 좀 알아야 한다.
프로그램이 실행되기 위해서는 그 프로그램 내에서 사용되는 변수들을 위한 메모리가 할당되어야 한다.
프로그램이 실행되면 CPU는 그 프로그램을 위한 메모리를 할당한다.
메모리는 데이터의 성향에 따라 대개 4가지 영역으로 나뉘어져 프로그램에서 읽어드린 데이터들을 분류합니다.
그 4가지 영역은 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉩니다.
1) 코드 영역
프로그램이 실행되면 모든 코드들이 이 코드 영역에 저장됩니다. 그리고 CPU가 와서 하나씩 차례로 실행합니다.2) 데이터 영역
전역변수와 static 변수들이 저장됩니다. 즉, 이곳의 데이터들은 프로그램이 시작될 때 생겨나서 프로그램이 끝날때 까지 남아 있습니다.3) 힙 영역
메모리 동적 할당 시 사용하는 공간입니다.4) 스택 영역
지역 변수와 매개 변수가 할당됩니다.int와 같은 자료형은 생성과 동시에 4byte라는 메모리가 할당되어야 한다.
하지만, string과 같은 자료형은 할당과 동시에 몇 바이트를 할당해야 하는지 알 수 없다.
따라서 int형으로 선언된 변수는 스택에 저장되고
string형으로 선언된 변수는 힙에 저장되는 것이다.
정확히 따지면,
int,byte,char,single,double,boolean,decimal과 같은 자료형들이 Value Type이고
String, Array, Object, Class, Interface, Delegate과 같은 자료형들이 Reference Type이라고 한다.
실제 메모리가 사용되는 과정을 보면서 더 잘 이해해보자.
예를 들어,
int a = 1;
이렇게 선언했다고 하자.
이렇게 된다는 말이다.
int형 변수에는 1과 같은 값이 저장된다.
즉, Value Type 변수에는 Value가 저장된다.
그렇다면,
string b = "bbbb";
이렇게 선언했다면?
이렇게 실제 값이 저장되어 있는 메모리의
주소를 가지고 있는 포인터를 가집니다.
실제 값을 가지고 있는 메모리의
참조를 가진다는 말입니다.
즉, Reference Type 변수는 Reference를 가집니다.
이런걸 왜 설명했을까요?
박싱(Boxing)이 바로 Value Type 변수를 Reference Type 변수로 바꾸는 과정이고
언박싱(UnBoxing)은 Reference Type 변수를 Value Type 변수로 바꾸는 과정이기 때문이다.
더 자세히 알아보도록 하자.
1. 박싱 (Boxing)
int i = 123;
//박싱 연산한다.
object o = i;
(궁금한 점 : O는 Reference 타입이므로 힙 영역에 저장되어야 하는것 아닌가??)
int i = 123;
object o = (object)i;
근데 만약 i값을 바꿔준다면 어떻게 될까?
o에 저장된것은 힙 영역에 있는 오브젝트의 참조이다.
이 오브젝트는 i가 저장하고 있는 값의 복사본을 저장하고 있다.
즉, i와 직접적으로 연결되어 있는 것이 아니라, 단지 i의 값을 복사해서 가지고 있을 뿐이므로
i값에는 영향을 미치지 않는다.
2. 언박싱(UnBoxing)
오브젝트 인스턴스가 지정한 Value Type을 boxing한 값인지 확인합니다. 인스턴스의 값을 Value Type 변수에 복사합니다.
int i =123;
object o = i; // 박싱
int j = (int)o; // 언박싱
예제
int j = (short)o;
다음 코드로 바꿔야한다.
int j = (int)o;
3. 왜 박싱과 언박싱을 할까?
4. 정리
C++과 C#의 차이 - 작성완료
C++ / C#
구조체와 클래스 차이
CPP
기본 접근 제한자가 class private, struct public
C#
구조체 가비지 대상아님
구조체 정적 바인딩
구조체 대입시 값의 복사가 됨
용량이 작고 임시적으로 쓰는 데이터를 구조체로 만드는 것이효과적
다른 구조체의 상속은 안되지만 인터페이스 상속은 된다.
(cpp 싱글포인터라고 생각하면 반먹고 들어감)
클래스 참조 자료형
동적바인딩으로 만들어진 힙에할당된 인스턴스를 참조하는 방식
클래스간의 대입시 인스턴스의 참조값이 대입됨
==========================================================================
C++과 C#의 차이점 #1: 선행처리기의 지시어로 #include가 없습니다. Java import와 비슷하게 using 이라는 키워드를 써서 library 에 있는 class 들을 쓸 수 있습니다. 나름대로 그 역할에 충실했던 선행처리기는 자신의 문제점과 함께 갈수록 기능이 줄어 드는 것 같습니다. 그렇지만 C#에서는 Java와 달리 conditional compiler을 위한 지시어들은 계속 지원하는 것 같습니다. 방준영님의 글에 따르면 "C++와의 차이점이라면 선행처리기가 컴파일러 안에 통합되어 있다는 것"이 라네요. 컴파일된 object 자체에 풍부한 metadata 가 포함되어 있다는 의미겠죠. 그렇게 되면 object 파일이 어쩔 수 없어 커진다는 문제도 있습니다. 이건 Embedded System 용으로는 치명적인 약점이 될 수도 있을 것입니다(Java C# CSharp cpp 프로그래밍언어 비교 선행처리기)
구조체와 클래스 차이
CPP
기본 접근 제한자가 class private, struct public
C#
구조체 가비지 대상아님
구조체 정적 바인딩
구조체 대입시 값의 복사가 됨
용량이 작고 임시적으로 쓰는 데이터를 구조체로 만드는 것이효과적
다른 구조체의 상속은 안되지만 인터페이스 상속은 된다.
(cpp 싱글포인터라고 생각하면 반먹고 들어감)
클래스 참조 자료형
동적바인딩으로 만들어진 힙에할당된 인스턴스를 참조하는 방식
클래스간의 대입시 인스턴스의 참조값이 대입됨
==========================================================================
- C++와 C#의 차이점 #2: Java Byte Code와 비슷하게 IL(Intermediate Language)라는 중간 코드가 있습니다. IL은 Java Byte Code와는 다르게 여러 프로그래밍 언어를 지원하네요. VB, C#, C++ 등. 홍민희님이 그러시는데, JScript.NET, Boo, F# 등이 있다고 하네요(프로그래밍언어 C# C++ Java 비교 중간언어 cpp CSharp)2008-07-08 23:23:07
- C++와 C#의 차이점 #3: Application을 의미하는 클래스가 꼭 있어야 합니다. 프로그램 진입점이 ApplicationClass.Main() 이네요. Java는 ApplicationClss.main() 인데… 마치 대학교때 친구 숙제 베껴서 낼 때 변수 이름만 바꾼 듯한 느낌이 드는 것은 저만의 느낌일까요 ? (프로그래밍언어 C# C++ Java 비교 cpp CSharp 프로그램진입점)2008-07-08 23:26:33
- C++와 C#의 차이점 #4: Array가 단순 메모리 공간이 아닌 부가정보를 가진 객체입니다. 즉, 간단한 예로, array.Length 이런게 먹힌다는 거죠. Java 랑 정말 비슷합니다. C에서처럼 array의 element 개수를 주고 받느라 귀찮게 함수 형식인자 하나 더 쓸 필요가 없다는 것이고, C++에서처럼 element 개수를 가지고 있는 array class를 정의할 필요도 없다는 것이죠. 또는 vector 를 쓸 때처럼 초기화할 때 불편하게 초기화할 필요도 없겠죠. 초기화 방식이 built-in type 하고 똑같으니까요. 물론 최근 c++0x에서는도 언어수준에서 vector 같은 클래스에 대해 uniform initialization 이 가능하게 하려고 하고 있긴 하죠(프로그래밍언어 C# C++ Java 비교 cpp CSharp array)2008-07-08 23:30:26
- int[] ia = { 100 }; System.Console.WriteLine(ia[2]); 했더니 “처리되지 않은 예외: System.IndexOutOfRangeException: 인덱스가 배열 범위를 벗어났습니다”라는 run-time exception이 발생하네요. 이 얘기는 array access 할 때마다 range check 를 한다는 얘기인데… bug 를 막는데는 도움이 되겠지만 성능에는 좋지 않을 것입니다. 언어의 설계 철학을 느낄 수 있는 대목입니다.
- C++와 C#의 차이점 #5: 설계 철학이 다릅니다(프로그래밍언어 C# C++ Java 비교 cpp CSharp 설계철학)2008-07-08 23:37:47
- C++는 꼭 쓸사람만 비용을 부담하게 하자는 주의이고(수익자 부담의 원칙이랄까...), C#은 Modern Language 답게 비용이 부담되더라도 버그가 생길 여지를 아예 없애자라는 주의입니다. 요즘 같이 CPU 성능이 갈수록 좋아지는 때에는 Java 나 C# 같은 언어가 좋게 느껴질 수도 있지만 여전히 아주 다양한 Embedded System 에 쓰기는 무리일 것입니다. 세상은 우리가 생각하는 것보다 우리가 경험한 것보다 훨씬 다양하고 다채롭죠.
- C++와 C#의 차이점 #6: sbyte, short, int, long, byte, ushort, uint, ulong, float, double, decimal, bool 등 기본 데이터 타입의 크기가 표준화되어 있습니다. 이건 참 맘에 든다. C++도 이렇게 표준화 됐었으면 좋으련만. 그럼 프로젝트 할 때마 OSAL에 int8, int16, int32, int64 이딴거 정의 안해도 될텐데 말입니다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 기본데이터타입)2008-07-08 23:44:01
- C++와 C#의 차이점 #7: 상속 계층의 꼭대기에 언어 수준의 object(Java 에서는 Object) 라는 class가 있습니다. 방준영님의 글에 따르면 "엄밀히 구분하면 object는 C#의 키워드고 실제 클래스명은 자바와 같이 Object다"라고 하네요. 각종 언어 수준의 작업을 일관된 인터페이스로 해주는 녀석이겠죠. 이것도 type system에 구멍이 생길 수 있어서 논란의 여지가 있습니다. 저에게는 object 는 마치 C++의 void * 같은 녀석처럼 보이네요. ^^(프로그래밍언어 C# C++ Java 비교 cpp CSharp 상속계층꼭대기기본클래스 object)2008-07-08 23:55:55
- C++와 C#의 차이점 #8: 문자열 리터럴이 char * 가 아니라 언어 수준의 utf-16(Java 에서 String 은 utf-8 이던가요 ? 방준영님의 글에 따르면 "자바도 C#과 마찬가지로 String 타입이 UTF-16이다"라고 하네요.) 유니코드 문자열 클래스인 string의 인스턴스이다. “hello” 라고 하면 내부적으로 적어도 10 bytes 가 할당되겠네. 메모리가 싼 요즘엔 별 이슈는 안되겠다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 문자열리터럴 string)2008-07-09 00:04:57
- C++와 C#의 차이점 #9: C++와 달리 pointer 사용에 제약이 있는 것 같다(이건 정확한 게 아니라서 나중에 더 확인하고 정리해 보겠습니다). 큰 장점이자 단점이 될 수 있겠지. 그런데 이제 단점으로 작용하는 영역이 별로 클 것 같진 않다. OS나 Device Driver 에서나 쓰기 어렵지 다른 곳에서 웬만하면 쓰일 수 있을테니까. 방준영님의 글에 따르면 "C#에도 포인터가 있다. C#으로 만든 OS도 있다"고 하네요.(프로그래밍언어 C# C++ Java 비교 cpp CSharp pointer 포인터)2008-07-09 00:10:38
- C++와 C#의 차이점 #10: C++의 struct 는 또다른 class 이지만 C#의 struct 는 힙에 할당할 수도 없고, 상속 관계를 쓸 수도 없습니다. 무조건 object 에서 직빵으로 상속받는군요. 그리고 default accessibility 는 private 이네요(C++에서는 public 이죠)(프로그래밍언어 C# C++ Java 비교 cpp CSharp struct)2008-07-09 00:30:56
- 아주 간단한 concrete object 를 정의할 때나 써 먹는 게 낫겠습니다. 힙에 할당도 안되고, reference로 가리킬 수도 없고 값 형식만으로만 쓰기 때문에 큰 객체는 정의할 꿈도 꾸지 않는게 낫겠네요
- new 로 할당하더라도 heap에 할당되는 게 아니라 스택에 할당됩니다. 그리고 모든 연산에 대해 항상 값 자체를 리턴합니다. matrix 를 struct 로 정의하면 모든 연산을 할 때마다 stack 안에서 엄청난 임시 객체들이 만들어지고, 계속해서 객체 복사가 일어난다는 뜻입니다. 허걱! struct를 써서는 각종 optimize 를 할 수가 없다는 뜻이겠죠. 웬만하면 class 를 써야겠네요.
- C++와 C#의 차이점 #11: C#의 class 는 단일 상속만 허용됩니다. 그리고, 멤버 변수 및 멤버 함수 외에 속성, 인덱서, 이벤트 등의 멤버가 있고, access 도 internal, protected internal 이 있습니다. Java와 같이 interface 를 따로 뒀으니 단일 상속으로 해도 별로 문제 될 것 같진 않습니다(프로그래밍언어 C# C++ Java 비교 cpp CSharp 클래스 class)2008-07-09 00:46:52
- C++와 C#의 차이점 #12: C#에서 함수 매개 변수 선언시에는 값 매개 변수 외에 참조 매개 변수(ref 키워드 사용), 출력 매개 변수(out 키워드 사용)를 지정할 수 있습니다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 매개변수)2008-07-09 00:51:28
- 그리고 params 라는 키워드로 매개 변수를 배열로 지정할 수 있는데… 그건 C/C++에서 매개변수에 대해 '...'이라고 표시하고 함수 implementation 안에서는 va_arg 를 쓰는 것과 비슷합니다. 단지 매개 변수 배열로 넘기면 마치 array 쓰듯이 할 수 있다는 점이 다르겠죠. 단순 syntactic sugar 라고 생각됩니다.
- 함수의 signature 에는 ref, out 키워드가 붙어 있는지의 여부도 포함됩니다. 단, ref, out 만다른 함수 overload 는 불가능합니다.
- C++와 C#의 차이점 #13: 초기화되지 않은 지역 변수를 사용하려고 하면 컴파일러 에러(경고가 아니라!!!)가 발생한다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 지역변수 초기화)2008-07-09 00:59:27
- 초보 프로그래머들이 저지르기 쉬운 실수를 미연에 막아준다. 좋은 특징이라고 생각됩니다. out 과 ref 를 구분해서 초기화되지 않은 경우를 컴파일러가 쉽게 알아낼 수 있도록 한 것도 눈에 띄네요. 똑똑한 것들!
- C++와 C#의 차이점 #14: 가상 함수와 순수 가상 함수를 나타내는 키워드를 분리했습니다. 가상 함수는 virtual, 순수 가상 함수는 abstract! subtype 이 override 할 때는 override 라는 키워드를 써야 합니다. 순수 가상 함수는 interface 와 기능이 겹칠 것 같은데… 왜 class 에서도 중복해서 지원할까? 단일 상속 제약때문에 그럴까요 ? 방준영님의 글에 따르면 "인터페이스가 있는데도 굳이 순수 가상 함수를 둔 이유는 일부 함수는 상위 클래스에서 미리 구현하고 일부 함수는 하위 클래스에 구현을 맡기는 형태의 디자인이 가능하기 때문. 반대로 정말 순수하게 순수 가상 함수로만 이루어진 클래스를 만든다면 인터페이스를 쓰는 쪽이 훨씬 깔끔하다"라고 하네요.(프로그래밍언어 C# C++ Java 비교 cpp CSharp 가상함수)2008-07-09 01:10:33
- C++와 C#의 차이점 #15: 형식 매개 변수의 형태로 template과 같은 기능을 제공합니다. C#용어로는 지네릭이라고 합니다. C++처럼 강력한 generic programming 이 가능한지는 모르겠지만. 그리고, template이란 키워드를 사용하지 않고 <> 안에 형식 매개변수만 나열하면 됩니다(프로그래밍언어 C# C++ Java 비교 cpp CSharp template)2008-07-09 01:15:30
- C++와 C#의 차이점 #16: 클래스의 event 멤버는 signal/slot 기능을 언어 수준에서 제공해주는 것입니다. event는 delegate와 연결됩니다. Boost.Signal library 처럼 type safe signal/slot 기능을 제공해 줍니다. event 멤버를 정의하면 +=, -= 을 이용해서 event handler 를 등록하고 제거할 수 있습니다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp class event member delegate)2008-07-09 01:26:13
- C++와 C#의 차이점 #17: C++의 RAII idiom은 using 문으로 구현할 수 있습니다. using (resource 초기화) { // 실행 코드 } 이런식으로 작성하시면 됩니다.(프로그래밍언어 C# C++ Java 비교 cpp CSharp using구문 코드 블록)2008-07-09 01:32:35
- C++와 C#의 차이점 #18: loop construct 로 foreach도 있습니다. int[] ia = {1,2,3}; foreach (int e in ia) { … } 이런게 가능합니다. c++0x 에서도 비슷한 기능을 도입하려고 하고 있죠(프로그래밍언어 C# C++ Java 비교 cpp CSharp foreach)2008-07-09 01:35:42
- C++와 C#의 차이점 #19: scope operator 가 '::' 이 아니라 '.' 입니다. 전 이게 더 좋은 것 같아요. 어떤 경우는 :: 을 쓰고 어떤 경우는 . 을 쓰고 그랬는데, 이렇게 하나로 통일하는 게 좋은 것 같네요
링크드 리스트와 배열의 차이 - 작성완료
Stl Vector List 설명
장단점
간혹 둘중에 하나 그자리에서 짜보라고함
--------------------------------------------------------------------------------------------------------------
1. vector일반적인 배열처럼 vector는 개체들을 연속적인 메모리 공간에 저장한다.
즉, iterator 뿐 아니라 position index(operator [])로도 접근이 가능하다는 것이다.
vector는 동적으로 확장/축소가 가능한 dynamic array로 구현되어 있다.
강점
굳이 "일반적으로" 빠르다는 표현을 쓴 것은 특정 상황별로 달라지기 때문이다.
이는 아래 내용들을 모두 읽어보고 종합적으로 분석해 보면 알 수 있다.
약점
2. deque (double ended queue)
deque는 어느 정도 vector와 유사성이 있는 듯하면서도 상당히 많이 다르다고도 할 수 있는 시퀀스 컨테이너다.
우선, Random access iterator를 통한 개별 원소에 대한 접근이 가능하다. operator []도 지원된다.
그리고, 컨테이너의 크기 역시 동적으로 조절되지만, 그 방법은 vector의 그것과 많이 다르다.
강점
vector와 비슷해 보이지만, 두번째 강점이 vector와의 첫번째 차이점이다.
vector는 컨테이너 끝에 삽입/제거하는 것만이 빨랐지만, deque는 컨테이너 끝 뿐 아니라 처음부분에서의 삽입/제거도 효율이 높다. double ended 라는 naming...
이러한 특징으로 STL의 스택과 큐 클래스는 deque와 list로 구현이 가능하지만, 기본 클래스는 deque이다.
그리고 vector와의 두번째 차이점이 컨테이너의 동적 확장/축소 방식이다.
이는 어떻게 보면 deque의 불편한 점이 되기도 하고, vector보다 더 나은 점이 되기도 한다.
vector의 경우 컨테이너 내부 capacity가 고갈되면 이를 확장하기 위해 전체 메모리 크기만큼 reallocating이 발생한다.
하지만, deque의 경우 일정 크기를 가지는 chunk 단위로 확장되는 방식을 가지고 있다.
이렇기에 vector에 비해 다음과 같은 장단이 존재한다.
장점
3. list
list는 doubly linked list로 구현되어 있다.
강점
약점
장단점
간혹 둘중에 하나 그자리에서 짜보라고함
--------------------------------------------------------------------------------------------------------------
1. vector일반적인 배열처럼 vector는 개체들을 연속적인 메모리 공간에 저장한다.
즉, iterator 뿐 아니라 position index(operator [])로도 접근이 가능하다는 것이다.
vector는 동적으로 확장/축소가 가능한 dynamic array로 구현되어 있다.
강점
- 개별 원소들을 position index로 접근이 가능하다 (상수 복잡도)
- 원소를 컨테이너의 끝에 삽입/제거 하는 것이 빠르다 (상수-아모타이즈드 복잡도)
- 어떠한 순서로도 원소들을 순회할 수 있다. 즉, Random access iterating이 가능함. (로그 복잡도)
굳이 "일반적으로" 빠르다는 표현을 쓴 것은 특정 상황별로 달라지기 때문이다.
이는 아래 내용들을 모두 읽어보고 종합적으로 분석해 보면 알 수 있다.
약점
- 컨테이너의 끝 위치가 아닌 곳에서 삽입/제거 수행시 그 성능은 deque/list에 비해 현저히 떨어진다.
- 동적으로 컨테이너의 크기가 확장/축소되는 것이 편하기는 하나, 확장시의 reallocation은 비용이 꽤 크다.
- capacity를 확장 시켜줄 수 있는 적절한 크기의 reserve로 인한 메모리 확보가 중요.
2. deque (double ended queue)
deque는 어느 정도 vector와 유사성이 있는 듯하면서도 상당히 많이 다르다고도 할 수 있는 시퀀스 컨테이너다.
우선, Random access iterator를 통한 개별 원소에 대한 접근이 가능하다. operator []도 지원된다.
그리고, 컨테이너의 크기 역시 동적으로 조절되지만, 그 방법은 vector의 그것과 많이 다르다.
강점
- 개별 원소들을 position index로 접근이 가능하다.
- 원소를 컨테이너의 끝 뿐 아니라, 앞에서도 삽입/제거 하는 것이 빠르다.
- 어떠한 순서로도 원소들을 순회할 수 있다.
- 컨테이너의 시작 / 끝 위치가 아닌 곳에서 삽입/제거 수행시 그 성능은 list에 비해 현저히 떨어진다.
vector와 비슷해 보이지만, 두번째 강점이 vector와의 첫번째 차이점이다.
vector는 컨테이너 끝에 삽입/제거하는 것만이 빨랐지만, deque는 컨테이너 끝 뿐 아니라 처음부분에서의 삽입/제거도 효율이 높다. double ended 라는 naming...
이러한 특징으로 STL의 스택과 큐 클래스는 deque와 list로 구현이 가능하지만, 기본 클래스는 deque이다.
그리고 vector와의 두번째 차이점이 컨테이너의 동적 확장/축소 방식이다.
이는 어떻게 보면 deque의 불편한 점이 되기도 하고, vector보다 더 나은 점이 되기도 한다.
vector의 경우 컨테이너 내부 capacity가 고갈되면 이를 확장하기 위해 전체 메모리 크기만큼 reallocating이 발생한다.
하지만, deque의 경우 일정 크기를 가지는 chunk 단위로 확장되는 방식을 가지고 있다.
이렇기에 vector에 비해 다음과 같은 장단이 존재한다.
장점
- 저장 원소가 많고 메모리 할당량이 큰 경우 vector에 비해 확장 비용이 절감된다.
: 전체가 재할당되기 보다, 늘어나야 될 크기만큼만의 chunk가 하나 더 할당되면 그만이므로...
- 컨테이너 처음부터 끝까지 연속 메모리 공간이 아니므로, vector에서 가능했던 원소들간 포인터 연산이 불가능하다.
3. list
list는 doubly linked list로 구현되어 있다.
강점
- 컨테이너의 어느 위치에서도 삽입/제거가 빠르다 (상수 복잡도)
- 원소들의 컨테이너 내 순서 이동이 빠르다. (상수 복잡도)
약점
- 원소의 position index로 직접 접근이 불가능하다.
: 특정 원소에 접근하려면 처음이나 끝에서부터 선형 탐색을 하여야만 한다. - 컨테이너 내 원소 순회는 forward / reverse 순회만 가능하며, 느리다. (선형 복잡도)
- 원소들간 상호 연결 정보를 위해 추가적인 메모리가 사용된다.
: 원소 수가 적을수록 그 상대 비율은 올라가겠지 쩝;
패딩비트 ( struct ) - 작성 완료
출처 - http://bboy6604.tistory.com/entry/%EA%B5%AC%EC%A1%B0%EC%B2%B4%EC%99%80-Padding-Bit
구조체는 서로 다른 타입의 변수들을 묶어서 새로운 자료형으로 정의 하는 것입니다.
구조체에는 변수, 배열, 포인터,다른 구조체를 포함 할 수 있습니다.
Padding Bit
구조체의 크기는 구조체 안의 변수들을 합한 결과가 아니다.
다음의 코드를 보자.
총 11byte 이다.
하지만 sizeof 연산자를 통해크기를 출력하면 16byte가 나온다.
이것은 cpu 가 성능 저하를 막기 위해 넣어준 Padding Bit 때문이다.
32 bit cpu 가 데이터를 효율적으로 읽어 들이려면 32 bit 로 읽어야 한다.
그 이하면 필요없는 부분을 읽지 않는 작업을,
그 이상을 읽으면 32bit를 추가하고 나머지를 읽지 않는 작업을 해야한다.
이 과정에서 성능 저하가 일어난다.
그래서 구조체 변수를 읽어 올 때는 컴파일러가 성능 저하를 막기 위해 Padding bit 라는 것을 자동 추가 해준다. ( Padding bit 를 추가해주지 않는 컴파일러도 있다.)
Padding bit 가 추가되는 모습은 아래와 같습니다. (파란색 부분이 Padding bit 입니다.)
Padding bit 만큼 메모리를 낭비 되지만
32 bit 단위로 데이터를 읽어오면 되어 속도는 빨라진다.
Padding bit 는 컴파일러가 자동으로 추가 하는 것이기 때문에 사용자가 사용하지 않을 수있다. #pragma pack(1) 으로 전처리에 명령을 내리면 구조체를 1byte 단위로 읽기 때문에 구조체 구성 변수를 더한 값이 구조체의 크기가 된다.
하지만 #pragma 는 C 표준이 아니기 때문에 이식성이 낮다. 혼자만 쓰는 프로그램이면 #pragma 를 사용해도 크게 문제가 되지 않는다.
하지만 이 프로그램이 통신에 쓰인다면 치명적인 문제점을 안게 된다.
또 한 #pragma pack(1) 이라고 선언해주면 선언 이후의 코드들을 전부 1byte 단위로 데이터를 읽기 때문에 엄청난 성능저하를 가져오게 된다.
이러한 성능 저하를 막기 위해 우리가 1byte 씩 읽어오기를 원하는 코드 전에서 #pragma pack(1)을 선언해주고 그 코드의 끝 부분에 다시 #pragma pack(4) 로 선언해주면 된다. 위의 코드에 적용해보면 다음과 같게 됩니다.
구조체는 서로 다른 타입의 변수들을 묶어서 새로운 자료형으로 정의 하는 것입니다.
구조체에는 변수, 배열, 포인터,다른 구조체를 포함 할 수 있습니다.
Padding Bit
구조체의 크기는 구조체 안의 변수들을 합한 결과가 아니다.
다음의 코드를 보자.
struct st
{
int a;
char b;
short c;
char d;
int e;
}
int형 2개 8byte, char형 2개 2byte, short형 1개 2byte,총 11byte 이다.
하지만 sizeof 연산자를 통해크기를 출력하면 16byte가 나온다.
이것은 cpu 가 성능 저하를 막기 위해 넣어준 Padding Bit 때문이다.
32 bit cpu 가 데이터를 효율적으로 읽어 들이려면 32 bit 로 읽어야 한다.
그 이하면 필요없는 부분을 읽지 않는 작업을,
그 이상을 읽으면 32bit를 추가하고 나머지를 읽지 않는 작업을 해야한다.
이 과정에서 성능 저하가 일어난다.
그래서 구조체 변수를 읽어 올 때는 컴파일러가 성능 저하를 막기 위해 Padding bit 라는 것을 자동 추가 해준다. ( Padding bit 를 추가해주지 않는 컴파일러도 있다.)
Padding bit 가 추가되는 모습은 아래와 같습니다. (파란색 부분이 Padding bit 입니다.)
40
|
41
|
42
|
43
|
44
|
45
|
46
|
47
|
48
|
49
|
4A
|
4B
|
4C
|
4D
|
4E
|
4F
|
a
|
b
|
c
|
d
|
e
| |||||||||||
4byte
|
4byte
|
4byte
|
4byte
|
Padding bit 만큼 메모리를 낭비 되지만
32 bit 단위로 데이터를 읽어오면 되어 속도는 빨라진다.
하지만 이 프로그램이 통신에 쓰인다면 치명적인 문제점을 안게 된다.
또 한 #pragma pack(1) 이라고 선언해주면 선언 이후의 코드들을 전부 1byte 단위로 데이터를 읽기 때문에 엄청난 성능저하를 가져오게 된다.
이러한 성능 저하를 막기 위해 우리가 1byte 씩 읽어오기를 원하는 코드 전에서 #pragma pack(1)을 선언해주고 그 코드의 끝 부분에 다시 #pragma pack(4) 로 선언해주면 된다. 위의 코드에 적용해보면 다음과 같게 됩니다.
#include <stdio.h> |
하지만 이처럼 수정해주면 32 bit cpu에서는 괜찮지만 8 bit 나 16bit 또는 64 bit cpu 에서 다시 문제가 야기됩니다.
이때는 다음과 같이 해주면 됩니다.
#include <stdio.h>
#pragma pack(push, 1) //1byte 단위로 정렬 방식을 바꾸고 기존정렬방식을 스택에 저장합니다.
#pragma pack(pop) //스택에 저장한 정렬방식으로 다시 돌립니다. pack 지시자는 이 후 부터 선언되는 구조체의 정렬 방식을 지정하는 것입니다. 1은 컴파일러가 저장된 메모리에 데이터를 정렬하는 방법을 결정하는 byte의 크기입니다.
|
피드 구독하기:
글 (Atom)