[질문]C언의 구조체 in 구조체에 대해서...

NeoCode24의 이미지

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하시면 됩니다.

NeoCode24의 이미지

연속으로 테스트용으로 한것이 아닙니다.

함수에서 필요에 의해서 호출될때 자동으로
연결된겁니다..

설마.. 400이라는 숫자를 미리알고 잇었다면..

malloc를 안했겠죠..

doldori의 이미지

NeoCode24 wrote:
GroupOutInfo_t stGroupOutInfo[200];

위와 같이 구조체 안에 구조체가 있습니다.

stGroupOutInfo를 선언할때 구조체 배열로 200칸을 잡았습니다.

실질적으로 사이즈는 GroupOutInfo size * 200 + IfOutInfo size * 100 이 되겠죠?


아니오. sizeof(GroupOutInfo_t) * 200 이 됩니다. 이 안에 sizeof(IfOutInfo_t)도
포함됩니다.

메모리 관리 정책을 물으셨는데 다양한 선택이 있습니다.

1. 다른 문제는 없는데 단순히 낭비일 것 같아서라면 바꾸지 않고 지금처럼 쓴다.

2. 하나가 필요할 때마다 하나씩 malloc() 한다. 리스트로 구현했을 때 적당.
하지만 원래 배열이었던 것을 리스트로 바꾸면 따라서 변경되는 부분이 많을 것임.

3. 미리 넉넉하게 할당하고 그것을 다 쓰면 다시 넉넉하게 realloc().
이때는 할당된 갯수와 실제로 사용하는 갯수를 추적해야 함. 배열처럼 쓸 수 있음.

GroupOUtInfo_t* stGroupOutInfo = 0;
size_t nused = 0, nalloc = 0;
const size_t Increment = 32;

void reserve(size_t newsize)
{
    if (nalloc < newsize)
    {
        nalloc = max(newsize, nalloc + Increment);
        stGroupOutInfo = realloc(stGroupOutInfo, sizeof(*stGroupOutInfo) * nalloc);
    }
}

방법 2는 Increment == 1 인 경우임.

4. 방법 3의 변형으로 일정 갯수씩 증가하는 것이 아니라 지수적으로 증가하는 방법도 있음.

const double Factor = 1.5;
nalloc = max(newsize, nalloc * Factor);
NeoCode24의 이미지

realloc으로 사용하는 방법도 좋은것 같습니다..

그리고 다시 생각해 보니 GroupOutInfo * 200 이 맞네요 ㅎ

결국은 GroupOutInfo의 하나의 필드라는걸 깜빡했네요..

그런데...

alloc을 하여 그 변동에 따라 realloc을 하는 방법은 좋은데..

제가 추가 적으로 설명을 안드린 부분이...

이 값을 영구적으로 보전하고 있거나 하지는 않습니다.

다른 프로세스에 넘겨주고 나면 다 필요없어 집니다..

GroupOut 이라는 구조체에는 단지 SNMP로 수집한 값을

넣을 뿐이고.. 그 값을 다른 프로세스에게 넘기는데..

그런부분에서 malloc을 해서 처리하는 건 아무래도 부담이

되는건가요?

이야기가 결국 쳇바퀴를 돌게 되네요 ㅎㅎ

ㅡ,.ㅡ;;의 이미지

성능과 메모리를 동시에 고려해야한다면..
예상가능한 전체사용량의 최소 메모리를 한번에 할당하고
그메모리를 적절히 관리하면서 잘 잘라 아껴쓰세요.^^
그리고 더필요하면 그때그때 정정크기로 늘리면되죠.
오라클 테이블스페이스 늘이듯이 말이죠
단 프로그래밍이 난해해지는건 어쩔수 없습니다.


----------------------------------------------------------------------------

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.