c언어에서 구조체 멤버들은 시스템스택에 따로 잡히나요??
글쓴이: 이상민@Naver / 작성시간: 토, 2020/04/18 - 3:26오후
학교에서 공부 안하다가 군대와서 프로그래밍 공부를 다시 하고 있는데 문득 궁금한게 생겼네요.
전역변수나 지역변수, 함수등을 호출하면 시스템 스택에 저장되었다가 끝나면 pop된다고 알고 있는데
궁금한점은 만약에 구조체를 선언한다고 하면 구조체에 같이 있는 멤버들은 시스템 스택에 추가 될때 따로
스택에 들어가게 되나요 아니면 한꺼번에 같이 들어가게 되나요.
typedef example{ int a; char b; char c[10]; } typedef example test;
이렇게 된다면 스택에는 test하고 멤버들인 a, b, c이렇게 들어가나요 아니면 test만 들어가나요?
알려주시면 감사하겠습니다ㅠㅠ..
Forums:
함수를 호출할 때 그 호출 정보나 함수내의 지역변수를
함수를 호출할 때 그 호출 정보나 함수내의 지역변수는 스택에 저장되고 로드됩니다.
그 외에는 스택과 다른 곳(.DATA, .BSS 등)에서 처리됩니다.
따라서 test가 함수내에서 선언되면(지역변수) 스택에 잡히고, 전역변수로 선언되면 .DATA, .BSS 영역에 잡힙니다.
위 부분이 좀 이해가 안되지만 test가 스택에 들어간다면 한꺼번에 들어갑니다.
왜
이 질문을 하셨는지 모르겠는데 구조체가 크다고 (저처럼) 생각하셨나 보죠. 제 컴퓨터 한 3년 전쯤에 제가 한국 도착하자마자 샀는데, 본체 가격이 60만원이 안 됐습니다. 제 인생 최초로 외장 그래픽 카드도 달았고요. 그럼에도 램 크기는 12기가 바이트입니다.
그리고 정말 큰 구조체는 프로그래머가 뭘하든 컴파일러가 쪼개서 쓰는 멤버만 메모리에 넣습니다. 이제 프로그래밍을 시작하시는 단계라면, 그런 이슈는 크게 신경쓰지 마세요.
물론 물밑에서 어떤 일이 벌어지는지 이해하는 건 좋다고 생각합니다만, 그건 상대적으로 나중 일이고 코드 한 줄 한 줄 짜면서 이게 최적인지 아닌지 생각하시는 건 별로 바람직한 일은 아닐 것 같습니다.
메모리에 c, b, a 순으로 들어가고 test는
메모리에 아래와 같이 정렬되고 test는 따로 잡히지 않습니다. 따라서 아래 코드를 실행하면 a, b 값을 가져와 바로 사용 가능합니다.
---------------
Happy Hacking!
댓글 달기