구조체의 패킹에 대한 이야기
'Programming' 카테고리의 다른 글
NTFS에서 Sparse 파일을 만들기 (3) | 2012.01.03 |
---|---|
16TB 크기의 파일을 만들어내려면 얼마나 오래 걸릴까? (0) | 2012.01.01 |
프로그래머에게 가장 굴욕적인 순간은? (0) | 2011.12.19 |
C/C++ 코딩 스타일 이야기 (8) | 2011.10.24 |
레지스트리의 volatile 옵션 (0) | 2011.09.27 |
NTFS에서 Sparse 파일을 만들기 (3) | 2012.01.03 |
---|---|
16TB 크기의 파일을 만들어내려면 얼마나 오래 걸릴까? (0) | 2012.01.01 |
프로그래머에게 가장 굴욕적인 순간은? (0) | 2011.12.19 |
C/C++ 코딩 스타일 이야기 (8) | 2011.10.24 |
레지스트리의 volatile 옵션 (0) | 2011.09.27 |
레지스트리의 volatile 옵션 (0) | 2011.09.27 |
---|---|
알아두면 유용한 MoveFileEx 함수의 펜딩 옵션 (0) | 2011.07.17 |
윈도우 드라이버를 만들 때 알아야 할 기초적인 내용들 (2) | 2011.05.23 |
Duff's Device (0) | 2011.04.07 |
_countof 매크로 (0) | 2011.03.15 |
send(to, from, count) register short *to, *from; register count; { register n = (count + 7) / 8; switch(count % 8) { case 0: do{ *to = *from++; case 7: *to = *from++; case 6: *to = *from++; case 5: *to = *from++; case 4: *to = *from++; case 3: *to = *from++; case 2: *to = *from++; case 1: *to = *from++; } while(--n > 0); } }얼핏보면 switch 문장안에 do while 루프가 들어있는 것이 컴파일도 되지 않을 것처럼 보이지만 신기하게도 어느 컴파일러에서나 잘 컴파일된다.
switch(count & 7) { case 0 : goto lbl0; case 1 : goto lbl1; case 2 : goto lbl2; case 3 : goto lbl3; case 4 : goto lbl4; case 5 : goto lbl5; case 6 : goto lbl6; case 7 : goto lbl7; } lbl0: while(count > 0) { handle_one(); count--; lbl1: handle_one(); count--; lbl2: handle_one(); count--; lbl3: handle_one(); count--; lbl4: handle_one(); count--; lbl5: handle_one(); count--; lbl6: handle_one(); count--; lbl7: handle_one(); count--; }
do { *a = *b++; } while (--count > 0);위 코드에서 몇번이나 count가 0과 비교 되겠는가. b의 포인터 증가 연산은 몇번 일어나겠는가. 쉽다. count 번이다.
for(int i = 0; i < 100; i =+ 8) { *a = *b++; *a = *b++; *a = *b++; *a = *b++; *a = *b++; *a = *b++; *a = *b++; *a = *b++; }위처럼 루프를 풀어내는 것도 물론 가능하다. 그런데 숫자가 딱 나누어 떨어지지 않으면(위 예에서는 100 / 8) 나머지 처리를 밑에서 한번 더 해주어야 한다. Duff의 코드에서는 n을 (count + 7) / 8 로 정하고 case 구문의 숫자 위치를 적절히 배열하여 나머지 처리를 안해도 되도록 한 것이 중요한 포인트이다. 이렇게 하면 한방에 깔끔하게 처리할 수 있고 따라서 텍스트의 크기도 약간 더 작아진다. 사실 이 포인트가 C언어의 문법으로 범용적인 loop unrolling을 구현가능하게 하는 것이며 Duff's Device라고 불리는 아이디어이다.
메모리를 해제하기 전에 왜 널 체크를 하는걸까? (6) | 2011.05.29 |
---|---|
윈도우 드라이버를 만들 때 알아야 할 기초적인 내용들 (2) | 2011.05.23 |
_countof 매크로 (0) | 2011.03.15 |
FIELD_OFFSET 매크로 (1) | 2011.03.01 |
PAGED_CODE 매크로 (6) | 2011.02.27 |
포스팅 이전
https://jeho.page/essay/2011/03/15/_countof-%EB%A7%A4%ED%81%AC%EB%A1%9C.html
_countof 매크로
_countof 매크로는 배열의 원소 개수를 돌려주는 서비스 매크로이다. StringCchCopy나 strcpy_s 같은 함수들을 사용할 때 편리하게 사용할 수 있다.
jeho.page
윈도우 드라이버를 만들 때 알아야 할 기초적인 내용들 (2) | 2011.05.23 |
---|---|
Duff's Device (0) | 2011.04.07 |
FIELD_OFFSET 매크로 (1) | 2011.03.01 |
PAGED_CODE 매크로 (6) | 2011.02.27 |
디렉터리의 읽기 전용 속성 (4) | 2011.02.20 |
블로그 이전했습니다.
https://jeho.page/programming/2011/03/01/FIELD_OFFSET-%EB%A7%A4%ED%81%AC%EB%A1%9C.html
FIELD_OFFSET 매크로
typedef struct tagST { CHAR a; CHAR b; INT* c; INT64 d; INT cbName; WCHAR name[1]; } ST;
jeho.page
Duff's Device (0) | 2011.04.07 |
---|---|
_countof 매크로 (0) | 2011.03.15 |
PAGED_CODE 매크로 (6) | 2011.02.27 |
디렉터리의 읽기 전용 속성 (4) | 2011.02.20 |
알쏭달쏭한 typedef (9) | 2011.01.04 |
블로그 이전
https://jeho.page/programming/2010/01/13/pragma-message.html
비주얼 스튜디오에서 pragma message 로 실수 방지 하기
Jeffrey Richter의 Windows via C/C++ 예제 코드에는 공통 헤더파일이 있다. 이 곳을 살펴보면 유용하게 사용할 수 있을만한 팁들이 많이 있다. 그 중 가장 쉽고 편하게 쓸 수 있는 기능 하나를 소개하고자
jeho.page
로그 뷰어로써의 Vim (2) -원하는 문자열만 골라내기 (3) | 2010.06.20 |
---|---|
로그 뷰어로써의 Vim (1) -멀티 하이라이팅 (0) | 2010.06.20 |
Absolute path와 Canonical path의 차이점 (3) | 2010.01.13 |
2009년 최고의 프로그래밍 언어, Google의 Go (3) | 2010.01.10 |
boost 라이브러리로 커맨드 라인 파싱 쉽게 하기 (1) | 2009.09.12 |