2015년 7월 20일 월요일

20150720 구조체와 사용자 정의 자료형

#include <stdio.h>
#pragma pack(1) // 바이트 크기 최적화(1바이트에 최적화) 속도문제가 생길수 있다!

typedef struct _smart // 프로그래머가 바이트크기에 따라 잘 배치or
{
int A;     // 4
short B;  // 8인 이유는 메모리 공간이 32비트 체제에선 4바이트 크기를 가지기 때문에
int C;     // 12
char D;  // 16
short E;  // 16
char F;   // 20
char G;  // 20인 이유는 1바이트 다음에 1바이트는 빈공간을 만들지 않고 붙여서 저장
short H; // 20
char I;    // 24
short J;  // 24
char K;  // 28인 이유는 J가 2바이트이기에 1바이트인 I다음에 바로 2바이트가 오면
           //1바이트를 비우고 채우기 때문
}Smart;

#pragma pack(4) // 바이트 크기 최적화(4바이트) 속도문제를 해결하기 위해 구조체
// 생성시만 1바이트 최적화를 하고 생성완료후 원래되로 되돌린다!

int main(void)
{
printf("%d\n", sizeof(Smart));

return 0;
}

모든 구조체의 이름을 대상으로 struct 선언의 생략을 위한 typedeef 선언이 등장한다!
구조체의 정의와 typedef의 선언을 한데 묶을 수도 있고, 또 이렇게 선언하는 것이 보편적
typedef struct point
{
int xpos;
int ypos;
}Point;
위의 선언은 아래의 정의와 선언을 한데 묶은 것!
struct point
{
int xpos;
int ypos;
};
typedef struct point Point;

typedef 선언이 추가 되었다고 해서 struct 선언을 통한 구조체 변수의 선언이 불가능한
것은 아니다. 다음 2가지 방식으로 구조체 변수를 선언할 수 있다.

Point pos1; // typedef 선언을 이용한 변수의 선언 OK!
struct point pos2; // struct 선언을 추가한 형태의 변수선언 OK!

★구조체의 이름 생략 가능!

★구조체도 함수의 인자로 쓸수잇다! p478~479

24. Point curPos=GetCurrentPosition(); // cpu내부에 cen이 임시로 저장되기에 구조체는 4개가 생성된다! curPos는 스택에 만들어진다!(curPos=GetCurrentPosition())==(curPos=cen)

구조체의 크기가 커질수록 속도가 느려진다!(효율적으로 사용하려면 주소를 넘긴다!)

★구조체의 멤버로 선언된 배열도 통째로 복사된다!

★구조체 변수를 대상으로는 매우 제한된 형태의 연산만 허용이된다!
허용되는 가장 대표적인 연산은 대입연산이며, 그 이외로 주소 값 반환을 목적으로 하는
& 연산이나 구조체 변수의 크기를 반환하는 sizeof 정도의 연산만 허용이 된다!

★중첩구조체-구조체 변수도 구조체의 멤버로 선언될수 있다!

댓글 없음:

댓글 쓰기