[다시경량화] 자료형

ehghkwl·2026년 1월 19일

Lightweight Challenge

목록 보기
21/22

again&again... 또다시 처음부터다
생각하고 행동하자

자료형 크기와 주소

#include <iostream>

int main(){
    int a = 10;
    double b = 20.5;
    char c = 'A';

    std::cout << "=== datatype size check ===" << std::endl;
    std::cout << "int size: " << sizeof(a) << std::endl;
    std::cout << "double size: " << sizeof(b) << std::endl;
    std::cout << "char size: " << sizeof(c) << std::endl;

    std::cout << "=== memory address check ===" << std::endl;
    std::cout << "int address: " << &a << std::endl;
    std::cout << "double address: " << &b << std::endl;
    std::cout << "char address: " << static_cast<void*>(&c) << std::endl;
    return 0;
}

=== datatype size check ===
int size: 4
double size: 8
char size: 1
=== memory address check ===
int address: 0x61ff0c
double address: 0x61ff00
char address: A

❓: 왜 size가 4인데, 다음선언된 double 주소랑 12나 차이나는거지?

최신 cpu는 8byte 데이터를 읽을 때, 주소가 8의 배수인 곳에서 읽어야 훨씬 빠르게 처리할 수 있고, 이를 정렬(alignment)라고 한다.
int a가 0x61ff0c에 있어서, 8의 배수인 0x61ff08은 double 데이터를 담을 수 없기 때문에 하나 더 앞인 0x61ff00에 데이터를 넣었다. 이때, 중간에 0x61ff08~0x61ff0b는 버려지는 공간인 패딩 영역이 되어버린다.
참고로, 주소 하나는 1byte(=8bit)를 나타낸다.

❓: 왜 먼저 선언된 int주소가 double보다 더 높지?

저 함수 내부 선언된 지역변수들은 스택이라는 메모리 공간에 저장된다. 근데, 스택은 특이하게도 높은 주소에서 낮은 주소 방향으로 쌓인다. 그 이유는 아래 그림과 같이 heap 영역과 공통으로 메모리를 사용하고 있기 때문이다. 만약stack도 첫 주소 시작점이 정해져있고, 높은 주소 방향으로 쌓였다면, stack에 남은 영역이 많아도, heap을 부족한 경우가 쉽게 발생할 수 있다.

❓: 근데, 왜 stack과 heap 영역만 share하도록 설계된 것일까?

생각해보면, 단순하다. code/data영역에는 프로그램 코드와 전역 및 정적 변수가 있다. 런타임 시에, 새로 추가되지 않고, 크기가 이미 고정되어 있기 때문에 고정된 영역이다.
반면, heap/stack 영역에서는 실시간으로 크기가 변한다. 함수를 많이 호출하면, stack영역이 늘어나고, new/malloc으로 메모리를 사용하면 heap 이 늘어나기 때문에, 동적으로 변한다고 생각하면 된다.
Stack Overflow가 바로, stack이 heap 영역을 침범하는것, heap Overflow가 heap이 stack영역을 침번하는 것입니다.

❓: include에서 <>랑 ""랑 차이가 뭐지?

<>: 표준 라이브러리나 시스템 헤더를 가져올 때 사용
"": 사용자가 직접 만든 헤더 파일을 가져올 때 사용
include "cuda_runtime.h" 이거는? -> ""를 사용하면 컴파일러는 현재 프로젝트 폴더 확인 후, 없으면 추가로 설정한경로, 시스템 표준 경로 순으로 파일을 찾는다. cuda또한 외부 라이브러리이기 때문에 ""로 하는것이 맞다.

❓: char자료형은 c랑 &c랑 동일한 값인가? 같은 값이 출력되는데?

기존 c언어에서는 char은 단일 문자, char* 는 문자열로 취급했었다. 그래서 &c는 문자열의 시작으로 파악하고, null이 나올때까지 출력한다. 따라서, c는 변수에 들어있는 값을 말하고, &c는 문자열을 의미하게 되어버린다. 그래서 char를 주소로 필요로 할 때에는 명시적으로 형변환을 해주어야한다.

참고
https://lxxyeon.tistory.com/70

profile
안녕하세요.

0개의 댓글