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 언어 구조 체 의 메모리 사용 에 관 한 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
c 언어 간단한 파일 r/w 조작 방법데이터의 입력과 출력은 거의 모든 C 언어 프로그램과 수반된다. 입력이란 원본에서 데이터를 얻는 것이다. 출력은 단말기에 데이터를 쓰는 것으로 이해할 수 있다.이곳의 원본은 키보드, 마우스, 하드디스크, 시디, 스캐...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.