C 구조체에서 가변길이 문자열 처리.
글쓴이: splendor / 작성시간: 수, 2013/02/06 - 8:20오후
C로 url 주소의 리스트를 구조체로 만들려고 하는데요,
url주소의 길이도 제각각이고 몇개가 될지도 모릅니다.
아래와 같이 단순 무식하게 만들었는데,
#define URL_MAX_COUNT 255
#define URL_MAX_LENGTH 255
typedef struct _URL_LIST {
int url_count;
char urls[URL_MAX_COUNT][URL_MAX_LENGTH];
} URL_LIST;
위 구조체는 항상 MAX data 크기를 가지게 되서 memory 낭비가 되는데,
보다 최적화된 구조체는 없을까요?
Forums:
STL 컨테이너를 참조해보세요..
http://www.cplusplus.com/reference/
struct url { size_t size;
struct url {
size_t size;
char body[0];
};
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
제가 몇자
제가 몇자 덧붙이자면...
http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
gcc의 zero-length array하고 ISO C99의 flexible array member하고는 약간 차이가 있으니 유의하세요. 권장하는 쪽은 후자입니다.
해당 링크에서 ISO C90부터 flexible array member가 있다고 하는데, 제가 알기로 이건 C99에서부터 생긴걸로 알고 있습니다. 확인은 못하겠군요.
메모리 낭비를 없게 하려면 문자열마다 그 크기만큼
메모리 낭비를 없게 하려면 문자열마다 그 크기만큼 동적으로 할당하고
그걸 링크드리스트로 쭈욱 연결해서 관리하면 메모리 낭비는 없죠.
대신 느려집니다.
재미있는 생각이 떠올라 남겨봅니다.
리스트의 내용이 변경되거나 삭제되지 않는다면, 이런 꼴도 재밌을 것 같네요.
hdslist.h
hdslist.c
main.c
각각의 노드에 대해 동적할당을 하는 방식이 아닌,
문자열을 연속적으로 저장하는 배열을 만들고
이에 대해서만 길이를 조정하자는 거지요.
문자열이 여러 번 추가되어야 한다면 초기 align 값을 크게 주어
realloc 호출 횟수를 줄일 수 있습니다.
저는 이렇게 생각했습니다.
댓글 달기