일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 파이썬
- c#
- K6
- 리눅스
- SQL
- gradle
- 프로젝트
- 백준 알고리즘
- 운영체제
- 자바 프로젝트
- 자바
- 유사코드
- 티스토리
- 알고리즘
- jsp
- auto configure
- 초대장
- 파이썬 소스
- hyperledger
- JVM
- smart cast
- dynamic query
- 오라클 디비
- 오라클
- resilience4j
- 학점
- oracle
- 문법 정리
- spring
- MongoDB
Archives
- Today
- Total
모종닷컴
struct 사이즈 본문
반응형
[그림 1 - 1]
[그림1-1]과 같은 코드에서 test는 char(1)+double(8)+int(4) 로 13으로 알고 있을 것이다.
하지만 실제 코드를 쳐 보면 예상하던 사이즈와 다른 것을 알수 있다.
이것은 내가 현재 쓰고 있는 64비트 컴퓨터에서 64비트 컴파일러를 사용하여 8바이트 데이터를 처리하는 것에 가장 최적화되어 있고 이러한 이유로 데이터를 저장하기 위한 공간을 8바이트씩 할당 받기 때문이다.
위에 코드를 예를 들면
char형을 저장하기 위해 8바이트를 할당받고 char형을 저장한다. 그러면 7바이트가 남는데 그 남은 공간에 double(8)를 저장할 수 없어 7바이트를 빈공간으로 남겨두고 바로 8바이트를 다시 할당하는 것이다.
char |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
double |
|
|
|
|
|
|
|
이러한 공간낭비를 줄이기 위해서는 1) 8바이트로 저장될 것을 고려하여 저장하는 방법과 2) 특별한 전처리어를 사용하면 된다.
1) 먼저 8바이트가 저장될 것을 고려하여 저장하여 보자.
8바이트가 저장될 것을 고려하여 저장할 경우 구조체의 멤버 변수 선언의 순서가 중요하다
순서는 다음과 같이 바꿀수 있다.
double double
int or char
char int
double |
|
|
|
|
|
|
|
int |
|
|
|
char |
|
|
|
[그림 1 - 2]
2) #pragma pack() 전처리어 사용
[그림 1 - 3]
pragma pack(1)에서 1은 1바이트 단위로 저장하겠다는 것이다.
단, CPU가 64비트이기 때문에 가장 빠르게 읽을 수 있는 데이터의 단위는 8바이트이다.
그렇기 때문에 저장할 때 1이라고 선언하고 나중에 원래대로 8바이트 단위로 바꾸지 않는 다면 속도저하의 문제가 발생할 수 있다.
반응형
'Programming > C' 카테고리의 다른 글
C#의 특징 (0) | 2017.10.02 |
---|---|
[C#]개미 수열, 엔트 수열 (1) | 2017.09.22 |
c# 오류 프로그램에는 진입점에 적합한 정적'Main'메서드가 포함되어 있지 않습니다. (0) | 2017.09.07 |
<conio.h>, <windows.h>, 그리고 goto 함수 (0) | 2017.07.07 |
포인터의 배열 & 배열의 포인터 (0) | 2017.05.23 |