* 결과
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;
}
'IT > 프로그래밍' 카테고리의 다른 글
[vim] vi 편집기 실행시 마지막 편집한 라인으로 커서 놓기 (0) | 2023.09.14 |
---|---|
[python] 외부 프로세스 실행한 결과를 string을 받기 (0) | 2023.09.13 |
[Ajax/js] CORS (Cross-Origin Resource Sharing) 하는 방법 (0) | 2023.09.13 |
java/jsp 해당 메소드가 있는지 체크 (0) | 2023.09.13 |
[svn] update칠때 날짜와 시간으로 하기 (0) | 2023.09.13 |