'2013/12'에 해당되는 글 4건

  1. 2013.12.24 vector::shrink_to_fit
  2. 2013.12.24 화살표 주석 달기
  3. 2013.12.24 모음 + 한자키 특수문자 표
  4. 2013.12.18 Timing Wheel

며칠 전에 zelon님과 함께 코드리뷰를 하다가 vector의 capacity에 대한 이야기가 나왔는데, 재미있는 일이 있었다. 지난 수년간 나는 vector의 capacity를 줄이기 위해서 clear() 함수 대신 resize(0)를 사용하고 있었는데, 내가 잘 못 알고 있었던 것.

나는 clear()는 데이터만 삭제할 뿐 내부 버퍼로 사용하는 메모리는 유지되는 반면 resize(0)는 버퍼까지 모두 정리하는 것이라고 말했는데, zelon님은 내가 반대로 알고 있다고 말했다. 그래서 누가 맞는지를 검색해보자고 찾아봤더니… 둘 다 틀렸음 ㅋㅋㅋ 결론적으로는 두 함수 모두 버퍼를 줄이지 않는다.

ESTL의 챕터 17에서 이에 대한 설명을 찾아볼 수 있다. 그리고 capacity를 사이즈에 맞게 줄일 수 있는 트릭을 제시하고 있는데,

vector<Contestant>(contestants).swap(contestants);

그리 쉽게 눈에 읽히지는 않는다.

헌데, C++11에서 capacity를 줄일 수 있는 새로운 인터페이스 shrink_to_fit() 이 추가됐다. vs2010에서는 ESTL과 동일하게 임시객체를 써서 구현되었다고 하는데, vs2013은 구현도 약간 다르다.

void shrink_to_fit()
{	// reduce capacity
	if (_Has_unused_capacity())
	{	// worth shrinking, do it
		if (empty())
			_Tidy();
		else
			_Reallocate(size());
	}
}

늘어난 버퍼를 줄이고 싶다면 resize()로 먼저 데이터 크기를 줄인 후, (혹은 clear()로 데이터를 비운 후) shrink_to_fit()을 호출해준다.

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<int> vecData;

	const int max_size = 10000;
	vecData.reserve(10000);

	for (int i = 0; i < max_size; i++)
	{
		vecData.push_back(i);
	}

	vecData.resize(200);
	vecData.shrink_to_fit();

	return 0;
}

'프로그래밍 팁 > C++' 카테고리의 다른 글

vector::shrink_to_fit  (0) 2013.12.24
Reconstructing parameters from x64 crash dumps  (0) 2013.07.17
x64 Stack Frame layout  (0) 2013.07.04
x64 Calling Convention  (0) 2013.07.04
Faux variadics  (0) 2013.06.21
type traits  (0) 2012.02.14
Posted by leafbird 트랙백 0 : 댓글 0

댓글을 달아 주세요

화살표 주석 달기

2013. 12. 24. 09:31 from 잡담

얼마전에 트위터에서 센스넘치는 주석 스샷을 본 적이 있는데,

완전 참신하다. 여태 십 년 동안 프로그램 짜면서 이런 주석은 처음 봤어.

그래서 오늘 나도 한 번 따라해봄 ㅎ

image

화살표 몸통은 한글 ㅂ 에서 한자키 눌러서 찍은└ 과 ─ 의 조합이다. 트윗에서 본 것처럼 적는건 너무 거창하고 힘들어 보이는데, 이 정도면 적당히 보기도 좋고 괜찮지 않나?

'잡담' 카테고리의 다른 글

아이폰에서 백업한 사진, 동영상을 정리해보자  (0) 2014.05.07
WikidPad  (0) 2014.04.11
화살표 주석 달기  (0) 2013.12.24
자료 정리  (0) 2013.11.18
최근의 장난감  (0) 2013.06.12
chocolatey  (0) 2013.03.20
Posted by leafbird 트랙백 0 : 댓글 0

댓글을 달아 주세요

모음 + 한자키 특수문자 표

2013. 12. 24. 09:22 from 기타

#&*@§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓◁◀ ▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧ ▦▩♨☏☎☜☞¶† ‡↕↗↙↖↘♭♩♪ ♬㉿㈜№㏇™㏂㏘℡ ªº
─│┌ ┐┘└├ ┬ ┤ ┴ ┼ ━┃┏┓┛┗┣ ┳ ┫┻ ╋┠ ┯ ┨┷ ┿ ┳
ⅰⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸⅹⅠⅡⅢ ⅣⅤⅥ Ⅶ Ⅷ Ⅷ Ⅸ Ⅹ
+-<=>±×÷≠≤≥∞∴♂♀∠⊥⌒∂∇≡≒≪≫√∽∝∵∫ ∬∈∋⊆⊇⊂⊃∪∩∧∨¬⇒⇔∀∃∮∑∏
스페이스 !',./:;?^_`| ̄、。·‥…¨〃­―∥ \∼´~˘ˇ˝˚˙¸˛¡¿ː
㉠㉡㉢..㉭ ㉮㉯㉰...㉻ ㈀㈁㈂...㈍ ㈎㈏㈐...
"( )[ ]{ }‘’“ ”〔 〕〈 〉《 》「 」『 』【 】
ⓐⓑⓒⓓⓔⓕ...ⓩ ①②③④⑤...⑮ ⒜⒝⒞...⒵ ⑴⑵⑶..⒂
$ % ₩ F ′ ″ ℃ Å ¢ £ ¥ ¤ ℉ ‰ ㎕ ㎖ ㎗ ℓ ㎘ ㏄ ㎣ ㎤ ㎠ ㎡ ㎢ ㏊ ㎍ ㎎ ㎏ ㏏ ㎈ ㎉ ㏈ ㎧ ㎨ ㎰ ㎱ ㎲ ㎳ ㎴ ㎵ ㎶ ㎷ ㎸ ㎹ ㎀ ㎁ ㎂ ㎃ ㎄ ㎺ ㎻ ㎼ ㎽ ㎾ ㎿ ㎐ ㎑ ㎒ ㎓ ㎔ Ω ㏀ ㏁ ㎊
ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδ εζηθικλμνξοπρστυφχψω
ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅏㅐㅑㅒㅔㅘㅙㅝㅞㅟㅢ
ㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㆂㆃㆄㆅㆆㆇㆈㆉ ㆊㆋㆌㆍㆎ
½⅓⅔¼¾⅛⅜⅝⅞¹²³⁴ⁿ₁₂₃₄

[출처] 한글자음+한자=특수문자|작성자 개믈기린


이게 별것 아닌 거 같아 보여도 가끔씩 필요한 경우가 있다.

오늘처럼 ㅎ


'기타' 카테고리의 다른 글

모음 + 한자키 특수문자 표  (0) 2013.12.24
Posted by leafbird 트랙백 0 : 댓글 0

댓글을 달아 주세요

Timing Wheel

2013. 12. 18. 17:25 from 프로그래밍 팁/기타

a4438aed0a7eea5a7840df89fe4cfdb6.png

Timing Wheel은 타이머를 구현할 때 유용하게 활용할 수 있는 자료구조다. 블로그에 한 번 정리해 둬야지 하고 미루기만 하다 이제야 끄적임. 정리라고 해봐야, 나중에 다시 검색할 때 키워드를 까먹지 않도록 자료구조 이름이라도 남겨두자는 것 뿐이다. NHN(이제는 Naver가 되어버린)의 hello world 블로그에 한글로 잘 정리된 포스팅이 있다. Timeing Wheel Data Structure를 구글링해도 자료는 많이 있음.

예전에 내가 직접 만들었던 서버 엔진에는 구조가 심플했고 독립적으로 정리된 타이머 모듈은 없었다. 이후에 간단한 타이머를 직접 만들어본 적은 있으나 그것도 boost::timer를 이용해서 대충 뚝딱 만들어본 단순한 구조였는데, 대량의 작업을 처리하기 위한 효율적인 타이머를 구현하려면 타이밍 휠을 이용해 만드는 것이 좋겠다.

Hello World 블로그의 글에 잘 설명되어 있지만 간략히 재정리 하자면, 배열을 이용해 일반적으로 만들면 O(n) 으로 처리해야 할 일들을 타이밍 휠을 써서 O(1)로 처리할 수 있게 된다. 타이머로 처리해야 할 task가 많다면 보다 효율적인 처리가 가능하다. 효율을 얻는 대신 감수해야 하는 단점도 있다. 메모리 사용량의 증가라든지, 고정된 단위시간 이하의 정밀한 시간 컨트롤이 어렵다든지, 미리 잡아놓은 circular-array 크기 * 단위시간 이상의 긴 시간에는 타이머를 걸 수 없다든지 하는 것들.

이 중 긴 시간을 쓸 수 없는 문제는 여분의 대기버퍼를 하나 더 마련하여 해결할 수 있다. 타이밍 휠에 바로 들어갈 수 없는 긴 시간의 task는 대기 버퍼에서 잠시 대기시키다 집어넣으면 됨. 나머지 단점 들이야 필요한 케이스에 맞춰 적절히 조절해주면 큰 문제랄 것도 없을 것 같다. 적어도 내가 겪어본 게임 서버 개발 시에는.

Posted by leafbird 트랙백 0 : 댓글 0

댓글을 달아 주세요