[질문]C언의 구조체 in 구조체에 대해서...
typedef struct IfOutInfo
{
int nData;
} IfOutInfo_t;
typedef struct GroupOutInfo
{
int nData;
struct IfOutInfo stOutIf[100];
} GroupOUtInfo_t;
GroupOutInfo_t stGroupOutInfo[200];
위와 같이 구조체 안에 구조체가 있습니다.
stGroupOutInfo를 선언할때 구조체 배열로 200칸을 잡았습니다.
실질적으로 사이즈는 GroupOutInfo size * 200 + IfOutInfo size * 100 이 되겠죠?
GroupOutInfo가 200개를 거의 다 쓰면 다행인데..
아무래도 그러지는 않을껏 같고.. 그렇다고 GroupOutInfo의
1개당 100개씩 구조채를 물린다는 것도 부담인것 같고..
아무리 봐도.. 이건 낭비가 심한것 같기에.. 수정을 위해
여러 가지 방법을 강구 보았습니다.
구조체 in 구조체를 malloc in malloc 으로 변경하였습니다.
GroupOutInfo도 리스트, IfOutInfo도 리스트로 하여
IfOutInfo를 GroupOutInfo.stOutIf에 물려서 사용했습니다.
이렇게 하고 malloc를 총 400번 하는 프로그램을 돌리고
종전과 비교를 하였더니.. 0.4초의 차이를 보이더군요.
(직접 시간 체크 함수 구현해서 비교하였어요~)
malloc 한번에 약 0.001초 정도 되는것 같더군요..
성능을 중요시 해야 하기때문에.. 이것역시 문제가 될껏 같기에
다른 방법을 강구하고 잇는데.
문뜩 떠오른것이 2차원 배열로 어찌 하면 되지 않을까 하는 생각이
듭니다..(이거역시 낭비가 있을것 같기는 하지만..)
혹시나 위와 같은 고민으로 해결을 보신분 있으시면 조언좀 해주세요..
아니면.. 위의 구조를 획기적인 다른 방법이 있으시다면
조언 부탁드릴께요 ^^
왜 malloc을 400번이나 해야 되죠? -_-;구조체를 사용하는
왜 malloc을 400번이나 해야 되죠? -_-;
구조체를 사용하는 순간 필요한 만큼만 malloc하시면 됩니다.
400번을 연속으로 한것이 아니라..
연속으로 테스트용으로 한것이 아닙니다.
함수에서 필요에 의해서 호출될때 자동으로
연결된겁니다..
설마.. 400이라는 숫자를 미리알고 잇었다면..
malloc를 안했겠죠..
Re: [질문]C언의 구조체 in 구조체에 대해서...
아니오. sizeof(GroupOutInfo_t) * 200 이 됩니다. 이 안에 sizeof(IfOutInfo_t)도
포함됩니다.
메모리 관리 정책을 물으셨는데 다양한 선택이 있습니다.
1. 다른 문제는 없는데 단순히 낭비일 것 같아서라면 바꾸지 않고 지금처럼 쓴다.
2. 하나가 필요할 때마다 하나씩 malloc() 한다. 리스트로 구현했을 때 적당.
하지만 원래 배열이었던 것을 리스트로 바꾸면 따라서 변경되는 부분이 많을 것임.
3. 미리 넉넉하게 할당하고 그것을 다 쓰면 다시 넉넉하게 realloc().
이때는 할당된 갯수와 실제로 사용하는 갯수를 추적해야 함. 배열처럼 쓸 수 있음.
방법 2는 Increment == 1 인 경우임.
4. 방법 3의 변형으로 일정 갯수씩 증가하는 것이 아니라 지수적으로 증가하는 방법도 있음.
그렇군요..realloc 이 있었네요..
realloc으로 사용하는 방법도 좋은것 같습니다..
그리고 다시 생각해 보니 GroupOutInfo * 200 이 맞네요 ㅎ
결국은 GroupOutInfo의 하나의 필드라는걸 깜빡했네요..
그런데...
alloc을 하여 그 변동에 따라 realloc을 하는 방법은 좋은데..
제가 추가 적으로 설명을 안드린 부분이...
이 값을 영구적으로 보전하고 있거나 하지는 않습니다.
다른 프로세스에 넘겨주고 나면 다 필요없어 집니다..
GroupOut 이라는 구조체에는 단지 SNMP로 수집한 값을
넣을 뿐이고.. 그 값을 다른 프로세스에게 넘기는데..
그런부분에서 malloc을 해서 처리하는 건 아무래도 부담이
되는건가요?
이야기가 결국 쳇바퀴를 돌게 되네요 ㅎㅎ
성능과 메모리를 동시에 고려해야한다면..예상가능한 전체사용량의 최소
성능과 메모리를 동시에 고려해야한다면..
예상가능한 전체사용량의 최소 메모리를 한번에 할당하고
그메모리를 적절히 관리하면서 잘 잘라 아껴쓰세요.^^
그리고 더필요하면 그때그때 정정크기로 늘리면되죠.
오라클 테이블스페이스 늘이듯이 말이죠
단 프로그래밍이 난해해지는건 어쩔수 없습니다.
----------------------------------------------------------------------------
댓글 달기