C 언어 구조 체 점용 메모리 깊이 설명

머리말
며칠 전 한 어린이 가 C 언어 구조 체 가 공간 을 차지 하 는 것 에 대해 물 었 다.나중에 귀 요 미 한테 도움 이 될 것 같 아서 먼저 쓰 려 고요.

struct Test
{
 int a;
 char b;
 int c;
} test;
이론 적 으로 구조 체 중의 각 구성원 은 메모리 에 연속 적 으로 저장 되 어야 한다.마치 배열 안의 요소 와 같다.사실,확실히 이 모양 이지 만,우리 가 상 상 했 던 것 과 는 좀 다르다.
우리 의 최초의 생각 에 따 르 면 변수 test 가 차지 하 는 메모 리 는 4+1+4=9 이다.
하지만 작은 코드 를 써 서 확인 해 보 니 우리 가 생각 하 는 것 과 달 랐 다.

그것 의 메모 리 는 12 이다.int 형식 은 4 개의 바이트 이기 때문에 각 멤버 의 메모리 가 가장 큰 설정 에 따라 설정 되 어 있 지 않 습 니까?결국 4*3=12,우 리 는 다시 실험 했다.

우리 의 추측 대로 라면 메모리 크기 는 8*3=24 일 것 이다.왜 16 일 까요?
다음은 제 가 정리 하 겠 습 니 다.
총결산
C 언어 구조 체 가 차지 하 는 메모리 크기 는 C 언어 메모리 정렬 과 관련 되 고 주소 지정 효율 을 향상 시 키 는 사상 이 안에 있다.구체 적 으로 는 여기 서 전개 하지 않 겠 습 니 다.관심 있 는 것 은 바 이 두 가 알 아 볼 수 있 습 니 다.
사실 귀 요 미 는 구조 체 의 메모리 크기 를 어떻게 계산 해 야 하 는 지 가장 궁금 하 다.
배열 과 지침 을 포함 하지 않 는 구조 체
포함 되 지 않 은 배열 과 포인터 의 구조 체 에 대해 서 는 각 구성원 이 차지 하 는 메모리 크기 를 알 고 직접 추가 할 수 있 습 니 다.그러나 추가 할 때 앞의 구성원 변수의 메모리 가 차지 하 는 메모 리 는 다음 구성원 변수 가 차지 하 는 메모리 의 전체 배수 이 어야 합 니 다.부족 하면 보충 해 야 합 니 다.그리고 마지막 결 과 는 메모리 공간 에서 가장 큰 구성원 변수의 전체 배 수 를 차지 해 야 합 니 다.
다음은 제 가 몇 가지 예 를 들 어 설명 하 겠 습 니 다.

struct Test
{
 double c; 	//8
 int a;		//4
 char b;		//1
} test;
메모리 크기 는 8+4+1=13,최대 메모리 8 이 므 로 8+4+4=16 을 이렇게 계산 해 야 합 니 다.
우리 교환 해 보 자.

struct Test
{
 int a;		//4
 double c; 	//8
 char b;		//1
} test;
메모리 크기 는 4+8+1=13 입 니 다.double 형식 은 8 개의 바이트 이 고 앞 에는 4 개의 바이트 만 있 으 며 구성원 변수 최대 메모리 가 8 이기 때문에 8+8+8=24 를 이렇게 계산 해 야 합 니 다.

struct Test
{
 int a;		//4
 char b;		//1
 double c; 	//8
} test;
같은 이치 로 4+1+8=13,4+4+8=16 으로 바 뀌 어야 합 니 다.
배열 과 지침 을 포함 하 는 구조 체 는 지침 을 포함 하 는 구조 체 를 포함한다.
지침 을 포함 하 는 구조 체 에 대해 서 는 위 와 같은 방법 으로 계산 할 수 있 습 니 다.일반 지침 의 크기 는 4 개의 바이트(내 컴퓨터 에 서 는 다 를 수 있 습 니 다)입 니 다.어떤 종류의 지침 이 든 주소 만 저장 하고 주소 가 공간 을 가리 키 는 내용 을 저장 할 필요 가 없 기 때 문 입 니 다.

struct Test
{
 char a;		//1
 char *b;	//4
 double c;	//8
} test;
struct Test
{
 char a;		//1
 int *b;	//4
 double c;	//8
} test;
struct Test
{
 char a;		//1
 double *b;	//4
 double c;	//8
} test;
이 세 가지 가 차지 하 는 메모리 크기 는 모두 4+4+8=16 이다.변수 b 와 변수 c 의 위 치 를 바 꾸 면 8+8+8=24 로 변 합 니 다.배열 을 포함 하 는 구조 체
배열 의 요소 주 소 는 연속 적 이기 때문에 한 배열 이 차지 하 는 공간 크기 는 배열 형식*요소 개수 입 니 다.
배열 이 차지 하 는 공간 크기 를 알 게 된 후에 구조 체 에 배열 이 포함 되 어 있 는 상황 을 어떻게 계산 하 는 지 말씀 드 리 겠 습 니 다.전에 계산 할 때 제 가 추가 할 때 앞의 구성원 변수의 메모리 가 차지 하 는 메모리 가 다음 구성원 변수 가 차지 하 는 메모리 의 전체 배 수 를 확보 해 야 한다 고 말 했 습 니 다.그러나 다음 변수 가 배열 이 라면 이런 요구 가 없습니다.
예 를 들 면:

struct Test
{
 int a;
 char b[21];
 int d;
 double c;
} test;
4+24+4+8=40 이 어야 합 니 다.

struct Test
{
 int a;
 char b[19];
 int d;
 double c;
} test;
4+20+8+8=40 이 어야 합 니 다.

struct Test
{
 char a;		//1
 char b[19];	//19
 int d;		//4
 double c;	//8
} test;
1+19+4+8=32 여야 합 니 다.

struct Test
{
 char a;		//1
 char b[17];	//17
 int d;		//4
 double c;	//8
} test;
1+19+4+8=32 여야 합 니 다.

struct Test
{
 char a;		//1
 char b[15];	//15
 int d;		//4
 double c;	//8
} test;
1+15+8+8=32 여야 합 니 다.
C 언어 구조 체 의 메모리 사용 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 C 언어 구조 체 의 메모리 사용 에 관 한 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기