intrusive data structure 소개

31
head obj head 0 obj head obj head list link link link data data data element element element non-intrusive slist intrusive data structure 소개 http://ohyecloudy.com ohyecloudy http://cafe.naver.com/architect1 아꿈사 2012.01.07

Upload: jongbin-oh

Post on 25-Jan-2015

3.171 views

Category:

Technology


4 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Intrusive data structure 소개

head

obj

head 0 obj

head

obj

head

list

link link link

head

obj

head 0 obj

head

obj

head

list

link link link

data data data

element element element

intrusive slist

non-intrusive slist

intrusive data structure

소개

http://ohyecloudy.com ohyecloudy http://cafe.naver.com/architect1 아꿈사

2012.01.07

Page 2: Intrusive data structure 소개

intrusive가 어떤 건지 살펴본다

어려운 개념은 아님

단지 낯선 느낌일 뿐

표준 라이브러리에서 채택된 경우는 없음

Page 3: Intrusive data structure 소개

Soukup J.: Intrusive Data Structures, C++ Report, Vol.10 (1998) http://www.codefarms.com/publications/intrusiv/Intrusive.pdf

이 문서를 바탕으로 발표자료를 만들었습니다.

Page 4: Intrusive data structure 소개

boost::intrusive intrusive로 구현된 자료구조. 우리에겐 boost가 있어요. 예제로 boost를 사용. 간단하게만 사용합니다. http://www.boost.org/doc/libs/1_48_0/doc/html/intrusive.html

Page 5: Intrusive data structure 소개

intrusive data structure?

Page 6: Intrusive data structure 소개

data structure는 자료구조 intrusive는?

일단 단어 정리부터

Page 7: Intrusive data structure 소개

끼어드는, 침입적인 뭔가 끼어 넣는 것이다.

Page 8: Intrusive data structure 소개

non-intrusive intrusive

STL에 정의된 모든 자료구조 일반적인 표준 라이브러리

Page 9: Intrusive data structure 소개

non-intrusive list에서 원소 삽입한다면?

지금부터는 설명이 쉬운 list로 설명

Page 10: Intrusive data structure 소개
Page 11: Intrusive data structure 소개

Memory

node(lLink, rLink, data)를 동적 할당.

복사 data data new

Page 12: Intrusive data structure 소개

data와 link를 저장할 수 있는 node를 할당

data는 복사.

우리가 포인터를 원소 타입으로 지정하는 이유.

std::list<BigObject> ssibal; (X) std::list<BigObject*> okayList; (O)

Page 13: Intrusive data structure 소개

intrusive list에서 원소 삽입한다면?

Page 14: Intrusive data structure 소개

뭐야!

non-intrusive랑 똑같잖아!

Page 15: Intrusive data structure 소개

Memory

node(lLink, rLink, data)를 동적 할당.

복사 data data new

다르다! node 할당이 따로 필요 없음. 원소가 link 정보를 가지고 있다.

Page 16: Intrusive data structure 소개

struct BigObject {

BigObject* lLink;

BigObject* rLink;

Data m_a;

Data m_b;

};

node(lLink,rLink,data)를 따로 할당할 필요가 없음. 원소 자체에 다 포함되어 있으니깐

BigObject는 리스트 원소.

리스트를 구성하는데 필요한 link 정보를 가지고 있다.

Page 17: Intrusive data structure 소개

non-intrusive intrusive

lLink data rLink node

BigObject

address of BigObject

lLink rLink

Page 18: Intrusive data structure 소개

정리하면

non-intrusive와 다르게 intrusive는

node가 갖고 있는 정보를 원소가 다 가지고 있다

list를 예로 들면 lLink, rLink를 원소가 가짐

Page 19: Intrusive data structure 소개

특 징

Page 20: Intrusive data structure 소개

추가 메모리 할당이 없다

이미 다 정의했다.

link 정보를 멤버로 정의한다.

Page 21: Intrusive data structure 소개

bi-directional access 가능

원소에 link 정보가 다 있다.

원소에서 unlink가 가능하다.

lLink, rLink를 다 알고 있음.

Page 22: Intrusive data structure 소개

struct MyClass :

public boost::intrusive::list_base_hook<>

{

int m_data;

};

typedef boost::intrusive:: list<MyClass> MyList;

lLink, rLink와 같은 링크 정보

Page 23: Intrusive data structure 소개

MyClass elem;

MyList container;

container.push_front(elem);

container.remove(elem);

or elem.unlink();

컨테이너 연산으로 리스트에서 제거

원소 연산으로 리스트에서 제거

Page 24: Intrusive data structure 소개

추가 포인터 점프가 없어 빠르다

데이터에 접근할 때 한번 더 점프 pointer가 원소일 때 non-intrusive

원소에 접근 == 데이터에 접근

intrusive

Page 25: Intrusive data structure 소개

공짜 수명제어 제공

링크 여부를 알 수 있어서

원소에서

소멸자에서 link 여부 검사

컨테이너에서 안 빼내고 해제 경고

혹은 소멸자에서 자동으로 제거

Page 26: Intrusive data structure 소개

class MyClass :

public boost::intrusive::list_base_hook<>

{

public:

MyClass () {}

~MyClass ()

{

unlink();

}

int m_data;

};

소멸자에서 unlink()하면 해제된 놈이 컨테이너에 남아있는 경우가 없다.

Page 27: Intrusive data structure 소개

primitive type을 그냥 못 넣는다

int를 넣으려면? 멤버를 int로 갖는 클래스 정의

불편

이런 불편이 기여하지 않았을까? 표준 구현이 non-intrusive가 되는데

추측

Page 28: Intrusive data structure 소개

정 리

Page 29: Intrusive data structure 소개

intrusive data structure는

링크와 같은 node 구성 요소를 원소가 들고 있음

추가 메모리 할당이 필요 없다

bi-directional access 가능

추가 포인터 점프가 없어 빠르다

공짜 수명제어 제공

primitive type을 그냥 넣지는 못한다

Page 30: Intrusive data structure 소개

단점이 적다

link 때문에 코드가 더러워져

원소에서 unlink와 같은 연산이 가능해 주의필요

우수한 구현 방법

Intrusive and non-intrusive containers - boost http://bit.ly/xR8vPI