본문 바로가기

IT/프로그래밍

Local변수가 Stack 어떤 순서로 쌓이는지 조사

728x90

* 결과
4번째 열인 시작주소의 값을 가지고 소팅해서 알아 보았다.
myserver>$ g++ test_stack.cpp -O3 -Wall
myserver>$ ./a.out |sort -k 4
1 str1024 SP 0xbf8fbb18 EP 0xbf8fbf18 LEN 1024
5 str0512 SP 0xbf8fbf18 EP 0xbf8fc118 LEN 512
8 str0427 SP 0xbf8fc118 EP 0xbf8fc2c3 LEN 427
9 str0005 SP 0xbf8fc2c3 EP 0xbf8fc2c8 LEN 5
3 idx SP 0xbf8fc2c8 EP 0xbf8fc2cc LEN 4
2 uint32_1 SP 0xbf8fc2cc EP 0xbf8fc2d0 LEN 4
7 str0003 SP 0xbf8fc2d1 EP 0xbf8fc2d4 LEN 3
4 uint16_1 SP 0xbf8fc2d4 EP 0xbf8fc2d6 LEN 2
6 bBool1 SP 0xbf8fc2d7 EP 0xbf8fc2d8 LEN 1

이 서버는 4바이트가 넘는 char array의 경우 padding 없이 붙어넣어지고
크기가 큰 순서로 소팅되어서 할당되어진다.

이러한 결과는 컴파일 환경(gcc 버전)에 따라 다를수 있음에 주의한다.

* 소스코드

#include <stdio.h>
#include <stdint.h>

#define PR_ADDR1(X,Y) printf("%d %s SP %p EP %p LEN %u \n", Y, #X, &(X), ((char*)&(X))+sizeof(X), sizeof(X));
int main()
{
  char str1024[1024];
  uint32_t uint32_1 = 512;
  int idx = 1;
  uint16_t uint16_1 = 512;
  char str0512[512];
  bool    bBool1;
  char str0003[3];
  char str0427[427];
  char str0005[5];

  // 출력순서 주의(선언된 순서로 적자)
  PR_ADDR1(str1024,idx++);
  PR_ADDR1(uint32_1,idx++);
  PR_ADDR1(idx,idx);
  idx++;
  PR_ADDR1(uint16_1,idx++);
  PR_ADDR1(str0512,idx++);
  PR_ADDR1(bBool1,idx++);
  PR_ADDR1(str0003,idx++);
  PR_ADDR1(str0427,idx++);
  PR_ADDR1(str0005,idx++);

  return 0;
}

728x90