C 언어 확장 가능한 배열 구현 및 Strict Aliasing 분석
Source
Evernote/Advanced View Required/C를 위한 확장 가능한 배열.md
Summary
본문은 C 언어로 확장 가능한 배열(Dynamic Array)을 구현하는 과정과 그 중 인터페이스 설계 시 고려해야 할 C 표준의 ‘Strict Aliasing’ 규칙에 대한 기술적 분석을 담고 있다. 저자는 C++ 템플릿이나 제너릭이 부재한 C 환경에서 일반화된 자료구조를 구현하기 위해 Sean Barrett 의 stb.h 나 MFC CString 에서 사용하는 ‘메타데이터를 데이터 앞쪽에 배치’하는 방식을 검토했으나, 이는 C99/C11 표준에서 정의되지 않은 동작 (Undefined Behavior) 을 유발할 수 있음을 지적한다. 특히 Strict Aliasing 규칙 하에서 포인터 캐스팅을 통한 타입 접근은 컴파일러 최적화를 방해하거나 예측 불가능한 오류를 초래할 수 있으므로, 표준 준수 및 안전한 메모리 관리를 위해 기존 코드를 수정·재활용하는 방향으로 최종 구현을 진행했다.
Key Points
- C 언어는 확장 가능한 배열과 같은 기본 자료구조가 표준 라이브러리에 부재하여, 수동으로 realloc 등을 관리해야 함.
- 인터페이스 설계 시 메타데이터 (size, alloc) 를 실제 데이터 포인터 앞에 배치하여 일반 배열처럼 접근하는 방식이 직관적이지만 표준 준수성에 문제가 있음.
- C99/C11 의 Strict Aliasing 규칙: 메모리 공간은 유효 타입 (Effective Type) 으로만 접근해야 하며, 호환되지 않는 타입의 포인터로 접근하는 것은 정의되지 않은 동작 (UB) 임.
- Strict Aliasing 위반 시 컴파일러는 최적화 과정에서 메모리 접근 순서나 값을 변경할 수 있어 프로그램 동작이 예측 불가능해짐.
- 안전한 구현을 위해 표준에 위배되지 않는 방식으로 기존 검증된 코드 (bab_xvector.h 등) 를 수정하여 재활용함.