가변레코드는 C/C++의 union과 같습니다.
메모리는 데이터를 담을 수 있는 최대 크기가 됩니다.
yes가 True일 경우
yes : 4byte, tel: 4byte => 8byte
yes가 False일 경우
yes: 4byte, phone: 4byte, address: 24byte => 32byte
두가지 경우를 모두 담을수 있게하기 위해서 32byte가 필요한겁니다.
*위의 경우 레코드에 packed를 안쓰셨기 때문에 4byte align을 위해서 padding byte가 추가된 크기입니다.
필요한 이유는 자신이 찾아야겠죠. 이러한 것을 안쓰고도 다른 방식으로 얼마든지 프로그래밍이 가능하니까요.
아래 선언은 델파이 도움말에 있는것인데, 이것을 잘 보시고 가변레코드를 안썼을 때와 비교해보세요.
type
TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);
TFigure = record
case TShapeList of
Rectangle: (Height, Width: Real);
Triangle: (Side1, Side2, Angle: Real);
Circle: (Radius: Real);
Ellipse, Other: ();
end;
델마를 향하여 님이 쓰신 글 :
: 델파이 가변부분이 왜 필요한지 모르겠어여
:
: type
: TRecord5 = record
: case yes : boolean of
: True: (tel : integer);
: False: (phone:integer;
: address : String[20]);
: end;
:
: 이렇게 선언하고 인스턴스 생성하면 sizeof(record5) ===>32byte나옵니다.
: 이걸로 봐서 메모리는 선언한 변수만큼 전부 할당되는것으로 보여집니다. (메모리효율적인 부분도 아니고)
: case문에 의해 접근을 여부가 결정되는것도 아닙니다. case 값이 True여도 False쪽 변수에 값넣고 showMessage로
: 찍어보면 찍힙니다.
:
: 즉 , 아래 일반적인 레코드랑 사용하는데 별 차이가 없는듯합니다. 책에 나온 내용도 딱히 이해가 안가고요.
:
: type
: TRecord5 = record
: tel : integer;
: phone:integer;
: address : String[20];
: end;
:
: 구체적으로 레코드 가변부분이 필요한 이유와 예를 하나 들어주시면 감사하겠습니다.
:
|