Q&A

  • 클래스를 이용하지 않고 데이터를 동적 생성하는 방법?
델파이에서 사용자가 생성하는 모든 클래스는 TObject클래스를 상속받는다고 알고 있습니다. (TMyClass = class 라고 선언해도 사실은 TMyClass = class(TObject)가 되는 거죠) 그런데 제가 지금 만들고 있는 프로그램에서 데이타를 동적으로 많이(때로는 아주 많이) 생성해서 TList에 Add해야 하는 상황이 생깁니다.

클래스 안에는 integer변수 5개와 string 변수 한개가 있고 생성자를 이용해서 변수들을 초기화 합니다. integer변수는 한개에 32bit(4byte)를 차지하고 string 변수는 한 글자당 한 바이트를 차지한다고 알고 있습니다.

여기서 string 변수는 16글자 이상이 되는 경우가 거의 없습니다. 대부분 1글자...
그렇다면 클래스에 들어간 변수들을 크기를 따져볼때 4byte X 5 + 최대 16byte = 36byte를 넘지 않습니다.
그런데 이런 변수들을 많이 생성하게 되니까 제 프로그램이 메모리를 수십MByte에서 심지어는 100MByte를 넘게 차지하는 일이 생깁니다. 제 생각에는 TObject클래스를 상속하기 때문에 제가 추가하지는 않았지만 클래스가 어쩔수 없이 차지하게 되는 메모리가 크기 때문에 그런 것 같습니다.

1. 메모리를 저렇게 많이 차지하게 되는 이유가 '기본적으로 TObject를 생성하게 될때 생기는 변수들'때문이 맞나요?

2. 그렇다면 클래스를 사용하지 않고 변수를 동적생성해서 TList에 Add시키는 방법이 있을까요?? record형을 정의해서 포인터를 사용하면 될 것 같은데...제가 경험이 부족해서 잘 모르겠습니다. ㅠㅠ

델파이 고수분들께서 도와주신다면 정말 감사하겠습니다. 좋은 주말 되세요~^
1  COMMENTS
  • Profile
    천희택 2005.09.03 07:01

    고수는 결코 아닙니다만....

    TList 의 경우 Add Parameter로 포인터를 넘기는 걸로 알고 있습니다. Add 할 때마다 4byte씩

    차지 합니다. 그리고 원래 Parameter로 포인터를 넘기기 때문에 당연히 record형을 정의 해서 포인터를

    넘겨 줄수 있습니다. 그리고 개인적으로 메모리를 100MB씩 차지한다고 그리 걱정할 필요는 없을 듯

    합니다. 메모리가 새지 않는 이상 오히려 메모리를 충분히 활용하여 퍼포먼스를 높이거나 다른 이익

    을 얻는다면 괜찮지 않나 싶습니다. 아래 소스는 허접하니 참고만 하시구염.. 다른 고수님들이 봐주실

    듯 합니다.

    <!--CodeS-->

    procedure TForm1.Button1Click(Sender: TObject);
    type
        TTestRecord = record
            Str : array [0..99] of char;
            Int1 : integer;
            Int2 : integer;
        end;
        pTestRecord = ^TTestRecord;


    var List : TList;
        TestRecordArray : array [0..9] of TTestRecord;
        i : integer;
        Str : string;
    begin

        List := TList.Create;

        for i := 0 to 9 do
        begin
            Str := 'Test' + IntToStr(i);
            StrPCopy(@TestRecordArray[i].Str, Str);
            TEstRecordArray[i].Int1 := i * 2;
            TestRecordArray[i].Int2 := i * 20;
        end;

        for i := 0 to 9 do
        begin
            List.Add(@TestRecordArray[i]);
        end;

        for i := 0 to 9 do
        begin
            Memo1.Lines.Add( TTestRecord(List.Items[i]^).Str );
        end;


        List.Free;
        List := nil;

    end;

    <!--CodeE-->
    • 김상욱
    • 2005.09.05 19:11
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이중철
      2005.09.06 03:02
      김영대분께서 잘 정리해 두셨거든요 그분 홈페이지에서 팁란을 참고해 보세요 http://www.howto.pe.kr ...
    • 토픽
    • 2005.09.04 03:13
    • 2 COMMENTS
    • /
    • 0 LIKES
    • Diablo
      2005.09.05 08:27
      sendmessage로 해결하세용~! sendmessage(받을놈 핸들, 메세지상수, 0, Longint(@값)); 사용법은 도움말 ...
    • 토픽
      2005.09.07 08:07
      답변감사합니다. 다 찾아봤는데 팁에 찾아보니 잘 나와있더군요.. 문제는 이해가 잘 안간다는것입니다....
    • 프로글래머
      2005.09.04 18:12
      해당 폼이 Create 되기 전에 데이타모듈을 Create, 해당 폼이 Close   되기 전에 데이타모듈을 ...
    • 이은주
      2005.09.06 23:47
    • 조영미
    • 2005.09.03 20:08
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 프로글래머
      2005.09.03 23:30
      단순하게, 스크롤박스 안의 내용을 움직여 스크롤 하려고 애쓰지 말고 스크롤박스의 스크롤바를 움직여서 ...
    • 허버벅
    • 2005.09.03 19:59
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이재필
    • 2005.09.03 19:32
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 임형준
    • 2005.09.03 06:30
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 천희택
      2005.09.03 07:01
      고수는 결코 아닙니다만.... TList 의 경우 Add Parameter로 포인터를 넘기는 걸로 알고 있습니다. Ad...
    • 프로글래머
      2005.09.03 18:55
      기본적으로 RB 메뉴에서 우선 툴바를 셋팅하세요. 'View-Toolbars' 메뉴를 클릭하면 됩니다. 제가 해본...
    • 조혜진
      2005.09.05 23:28
      Report Builder 사용하시는 분이 많지가 않은지 조언을 구하기 힘드네요. 님의 도움에 깊은 감사를 드립니...
    • 윤경미
    • 2005.09.02 23:19
    • 11 COMMENTS
    • /
    • 0 LIKES
    • 박홍재
      2005.09.03 15:20
    • 윤경미
      2005.09.03 20:21
    • 박홍재
      2005.09.04 09:02
    • 윤경미
      2005.09.06 03:12
    • 꼬미사랑
      2005.09.03 00:14
    • 윤경미
      2005.09.03 01:00
    • 꼬미사랑
      2005.09.03 01:18
    • • • •
    • 천희택
      2005.09.02 21:16
      흐음.... mysql이 4.1대로 넘어오면서 내부적으로 utf8으로 처리 한다고 들었습니다. my.cnf에서 [my...
    • 최선호
      2005.09.02 22:04
      우선 답변에 감사를 드립니다. 그런데 천희택님께서 말씀해주신 방법대로 했는데도 그대로 한글이 깨...
    • 최선호
      2005.09.02 22:11
      아 이제 됩니다. 쿼리문 날리기전에 set name euckr 쿼리문 날리고 하니까 한글이 제대로 들어가네요 천...
    • 조영미
    • 2005.09.02 19:52
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 꼬미사랑
      2005.09.03 03:17
      안녕하세요. 스크롤이라함은 마우스 휠 움직임을 말씀하시는듯하네요.. 그냥 간단하게 만들어봤습니다...
    • 조영미
      2005.09.03 20:17
      휠 마우스로 움직이는거 맞는데요. 이거 해보니 안 되더라고요..
    • srookie
      2005.09.02 20:01
      안녕하세요. WriteBuffer Method 같은 경우에는 함수 argument 상에 직접 보낼 수 있는 flag가 존재합니다...
    • 김경효
    • 2005.09.02 01:52
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 윤수아
      2005.09.15 20:38
      APD 4.05 버전을 사용하고 있습니다.. 기존 버전을 써보셨다면 특별한 차이는 없습니다. 우선은 통신이...
    • 이중철
      2005.09.02 19:09
      참고로 이런 프로젝트하실때는 Y-Cable을 제작해서 쓰는 것이 좋습니다.. 터미널에서 엔터값이 정확히 ...
    • 김경효
      2005.09.02 22:21
      우선, 답변달아주셔서 감사합니다. 그런데 한가지 여전히 문제는.... 제가보기엔 putstring() 자체가 ...
    • 이승훈
    • 2005.09.02 00:09
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이태형
      2005.09.02 04:26
      출처1 : http://www.jobkorea.co.kr/List_Edu/Edu_GIB_Read.asp?Ed_No=70605 출처2: http://www...
    • 윤경미
    • 2005.09.01 19:25
    • 8 COMMENTS
    • /
    • 0 LIKES
    • 꼬미사랑
      2005.09.01 20:56
      안녕하세요. 꼬미사랑입니다.. edit박스로 구현하기에는 여러개의 데이터가 있는 경우에는 힘들져..크크 ...
    • 모영철
      2005.09.01 20:29
      휴.. 맨 아래 디비연결 하는 내용은 잘모르겠어요...ㅠ.ㅠ 윗부분만 설명을 드리면 구조가 이렇습...
    • 윤경미
      2005.09.01 22:13
      답변 감사드립니다... 제가 너무 초보라 많이 답답하실듯..ㅠㅠ <!--CodeS--> if Not(Query...
    • 모영철
      2005.09.01 23:48
      예제를 만들었습니다.. 저도 님보다 더할
    • 윤경미
      2005.09.02 00:48
      말씀해 주신 데로 마우스 커서를 그리드에 클릭하면 edit가 바뀌네요~~ 신기하여라~~ 예제까지 보...
    • 박홍재
      2005.09.02 11:28
      모영철 님께서 잘 설명을 해 주셨는데 아직 초보시라 이해하기 힘드신듯.... 여러게의 값이 있는 Table의 ...
    • 모영철
      2005.09.02 01:30
      먼저 홍순이를 찾기 위해서 두가지 방법이 있습니다. 잘 집으셨어요.. 쿼리를 바꿔주고 다시 오픈하...
    • • • •
    • 꼬미사랑
      2005.09.01 20:47
      안녕하세요... 꼬미사랑입니다.. 그냥 제가 간단히 하나 만들었는뎅.. 원하는시는 답이 맞는지 몰겠네요.....
    • 꼬미사랑
      2005.09.01 21:00
      정확한 타이머는 타이머 콤포보다 CPU를 이용한 ticker 계열을 이용하는게 낫다고 하던데 아직 이용해보지...
    • 김지훈
    • 2005.09.01 18:18
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 정희돈
      2005.09.02 01:14
      말씀으로 보면 Form의 Canvas를 이용하신것 같은데요 Form은 모든것의 부모개체라 당연히 다른 컴포넌...