C/C++ (C99)의 가변 크기 배열

오 이런 뒷북이!

아시다시피 전통적인 C의 기능에서 여러 편리한 기능들이 추가가 되어 C99라는 이름으로 ANSI 표준으로 정해진 것이 있다. VC++ 컴파일러는 C99을 제대로 지원하지 않고 있는데 gcc는 이걸 지원을 해주고 있다. 그래서 지금까지 모르고 쓰던 기능이 제법있었다. 그 중에서도,

C99 introduced several new features, many of which had already been implemented as extensions in several compilers:

  • inline functions
  • variable declaration no longer restricted to file scope or the start of a compound statement
  • several new data types, including long long int, optional extended integer types, an explicit boolean data type, and a complex type to represent complex numbers
  • variable-length arrays
  • support for one-line comments beginning with //, as in BCPL or C++
  • new library functions, such as snprintf
  • new header files, such as stdbool.h and inttypes.h
  • type-generic math functions (tgmath.h)
  • improved support for IEEE floating point
  • designated initializers
  • compound literals
  • support for variadic macros (macros of variable arity)
  • restrict qualification to allow more aggressive code optimization

Variable-length arrays가 눈에 띈다. 흔히 C/C++ 책에 나오는 배열은

int A[10];

과 같이 배열의 크기가 항상 상수이어야 한다고 배웠다.. 컴파일 할 때, 그 값이 명시적으로 정해있어야만 한다. 그래야 그에 맞게 스택을 할당할 수 있기 때문이다. 그런데 C99에 도입된 새 기능 중 하나는 이 배열의 크기가 상수일 필요가 없다는 것이다. 예를 들어,

void foo(int size, int A[]){
int tempArr[size];
for (int i = 0; i < size; i++)
tempArr[i] = A[i];
}

이런 코드가 가능하다! 정말로 편리한 기능이 아닐 수 없다.

아마 구현은 크기값에 따라 스택을 동적으로 늘리는 것으로 구현하는 것 같다. 어차피 _alloca라는 힙이 아닌 스택에 할당하는 함수가 있기에 (이제는 더 안전한 버전인 _malloca을 쓰라고 권장됨) 충분히 만들 수 있는 기능일 것이다.

그 밖에도 전통적인 C를 쓰면서 불편했던 변수 선언 위치도 아무 곳에서 할 수 있고, 매크로도 가변 인자가 지원이 된다. 이것이 안되어서 지저분하게 #define FOO1(arg), #define FOO2(arg1, arg2) 이런식으로 쓰곤 했었는데 이런 삽질을 줄일 수 있다.

정말 뒷북이었다면 죄송.

by object | 2008/01/31 14:04 | 컴퓨터 | 트랙백(1) | 덧글(18)
트랙백 주소 : http://minjang.egloos.com/tb/1727588
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from NoSyu의 주저리 주저리 at 2008/03/22 23:43

제목 : C에서 가변 배열(Variable-Length Ar..
한 달 전 겨울 방학 때 학부에서 컴퓨터공학과 2학년 진입생들을 위해 C언어 강좌를 열었습니다. 그 시간표를 보니 1학년 때 배운 것 전부를 한다고 나와있더군요. 즉, 왠만한 C 언어 문법 책 전부를 일주일 만에 다 하겠다고 나와있었습니다. 물론 하루에 이론 3시간, 실습 3시간이라 시간은 많은지 모르겠지만, 과연 일주일만에 C 완성이라는 것이 가능한지 의문이었습니다. 하지만 저는 신청하였습니다. 왜냐하면 3년 동안 제대로 된 수업을 들지 않아......more

Commented by Sikuru at 2008/01/31 14:14
헉. 이건 어느 버전 Visual C++ 부터 되는건가요 ? -ㅁ-)?
설마 VS2008 ? (...)
Commented by 시즈하 at 2008/01/31 14:26
전에 마소에서 봐서 알고는 있었지만, 역시 gcc는 적용이 빠르군요.
MS에서는 과연 C++도 아닌 C의 새로운 표준을 적용 시킬 생각은 있을런지...
Commented by object at 2008/01/31 14:31
VS2008에서도 이건 안될 듯 합니다. 말씀대로 C++ 표준도 아니고 C 표준이라 요원해 보입니다 -_-; MS에 개발자만 수만명인데 이거 원..
Commented by object at 2008/01/31 14:35
그런데 컴파일러 수업 요즘 듣는데 가르치는 교수는 gcc 굉장히 무시하대요 ㅎㅎ 프로파일링 데이터 입력 못 받는 컴파일러라서 바보라고 ㅎㅎ VC++ 컴파일러는 프로파일 드리븐 최적화가 가능해요.
Commented by lifthrasii at 2008/01/31 15:34
gcc에도 프로파일 기반 최적화 기능 있어요. -fprofile-arcs로 프로파일링하고 -fbranch-probabilities를 써서 분기 예측에 반영시키는 게 가능하다고...
Commented by 랜덤여신 at 2008/01/31 15:55
헉... gcc가 저런 걸 지원한다고요? 저게 C인가요, C++인가요? ...
무..무섭네...
Commented by object at 2008/01/31 15:55
감사합니다. man page를 보니 일반적인 프로파일링 기반 최적화가 다 나와있네요 @@ 왜 그 친구 안된다고 했지.. 더 고차원적인 trace scheduling이 안된다고 한 것인가. 다시 확인해보겠습니다. 감사~
Commented by zoops at 2008/01/31 16:56
_alloca 는 표준함수가 아니죠?? 그죠??
저도 가끔 사용하긴 했습니다만... 표준함수가 아니였던 기억이...
Commented by object at 2008/01/31 17:03
리눅스에서는 alloca로 되어있는데요. 표준인지 아닌지는 잘 모르겠습니다. 아키텍처에 많이 의존적이니까 사용에 주의를. 특히 루프 안에서 _alloca를 쓰면 그냥 스택오버플로우 납니다.

과거 유니코드-ASCII 바꾸기 위해서 (요즘은 100% 유니코드 기반으로 만들지만) T2A(x)와 같은 매크로를 썼었죠. USED_CONVERSION인가를 해주고... 이게 _alloca를 이용해서 스택에 메모리 잡고 유니코드<->아스키 변환을 하는데 그만 이걸 루프 안에서 T2A를 써서 자꾸 스택 오버플로우 나더군요. 그때까진 T2A가 alloca를 부르는지도 몰랐다는.
Commented by Lohengrin at 2008/01/31 19:13
GCC는 아무래도 이런저런거 적용이 빠른것 같더군요. 그런데 아무래도 코드 호환성 등의 문제로 잘 안 쓰게 되는듯
Commented by 미친병아리 at 2008/02/02 17:45
VC++ 6.0은 C/C++ 컴파일러가 아니라고 불평하던 이야기가 생각이 나네요..
Commented by object at 2008/02/04 03:36
VC++ 6.0은 좀 아니죠 ㅎㅎ 다들 업그레이드 하시길!!
Commented by 조성경 at 2008/02/05 14:48
_malloca는 반드시 스택에 할당되는게 아닙니다. 1K(_ALLOCA_S_THRESHOLD) 이상의 메모리를 요청할 경우에는 힙을 할당하고, 힙에 할당된 메모리면 당연히 해제를 해줘야합니다. _freea라는 놈으로요.

기존의 _alloca 생각하고 쓰다가 봉변을 당할수도 있습니다. 전에 심심해서 MSDN 읽다가 먹던거 목에 걸릴뻔 했어요-_-;;
Commented by object at 2008/02/05 17:52
또 그런 주의점이 있군요;; 가변 배열에선 아주 큰 값이 들어올 때 어떻게 처리되는지 봐야겠네요.
Commented by 오스카 at 2008/02/09 01:03
visual studio 2008 및 최신 C++ Builder 에서도 가변 배열은 지원 안되는군요 ㅋ
딴 이야기이지만 template의 export는 언제쯤... ;;; gcc 에서는 되는지 궁금하네요.
Commented by drvoss at 2008/02/10 04:59
오.. (사실 RSS 전문 서비스로 지난 31일에 봤습니다. ^^;;) 가변 배열이 표준이라니 놀랍습니다. VS2008에서는 tr1::array로 비슷하게만 달래야 할것 같습니다. VS에서 template export는, 작년에는 당분간 지원 안한다고 했었는데 올해도 모 안될것 같고, 차기 버전에서 지원 되는지 한번 물어 보겠습니다.
항상 좋은내용 감사히 보고 있습니다. ^^
Commented by object at 2008/02/10 11:53
template export라.. 그런 기능도 있군요..
Commented by NoSyu at 2008/02/19 11:49
정말 해보니 그렇네요.
저도 뒷북...거의 10년이 다되어가는...OTL......

:         :

:

비공개 덧글

<< 이전 페이지 다음 페이지 >>





by 김민장 2008 이글루스 TOP 100
최근 등록된 덧글
개발자 입장에서의 수많은 ..
by Jiyoon at 02/04
저도 아들 돌잔치때 돌잡이 ..
by 박상욱 at 01/18
미국 대학원 원서 작성중에 p..
by 태클사이야 at 01/13
TO: 박PD 로그인 하지 않아..
by 박응용 at 01/10
http://gigglehd.com/zbx..
by dhunter at 12/28
우와.. 좋네요. 태반이 ..
by 윤광배 at 12/17
항상 좋은 글 잘 보고 있습니..
by y2k at 11/23
글이 좋아서 제 블로그에 담..
by 쏭섭 at 11/23
최근 등록된 트랙백
조엘 스폴스키의 강연 (Sta..
by 인덕원칸타타
[Redis] sds.c를 분..
by 조급하지말고 천천히
메뉴릿
이글루 파인더

website counter

Add to Google

rss

skin by 이글루스