컴퓨터는 메모리 주소를 단순히 비트로 판단하고, 데이터 타입은 알지 못한다. 그래서 이러한 조작하여 다양한 데이터 유형을 표현하는 것이 소프트웨어가 할 일이다. → 기계어는 주소만을 가지고 계산한다.

메모리의 기본 단위: 비트와 워드

Untitled

메모리 버스

메모리 버스는 여러 개의 와이어로 구성되어 있으며, 각 와이어는 한 번에 한 비트씩 전송합니다. 버스가 가진 와이어의 갯수를 width 넓이라고 한다. 메모리 버스의 넓이가 워드 크기를 결정합니다.

CPU ↔ Memory transfer

CPU는 메모리버스의 넓이인 word 단위로 데이터에 접근한다. CPU는 레지스터를 통해서 연산하는데 이 단위는 정수의 기본단위인 word 이다. 하지만 일부 CPU는 하나의 레지스터에서 한개이상의 정수 연산이 가능하다. → 즉 word와 register의 크기는 항상 같지 않다.

메모리의 구조화

컴퓨터 메모리는 단순히 비트의 연속이지만, 프로그래밍 언어에서는 boolean, class, string, struct 등 다양한 데이터 유형을 사용한다. 이는 메모리의 영역에 특정 데이터 유형을 부여하는 규칙을 통해 가능하다. 예를 들어, C 언어의 문자열은 메모리 상에서 연속된 바이트들의 배열로 표현됩니다.

16진수 표기법

컴퓨터 메모리를 다룰 때는 16진수(hexadecimal) 표기법을 자주 사용합니다. 16진수는 0부터 9까지의 숫자와 A부터 F까지의 문자를 사용하여 숫자를 표현하는 방식입니다. 따라서 두 자리의 16진수는 8비트(1바이트)를 나타낼 수 있어 메모리 주소나 데이터 값을 표현하기에 편리합니다.

C 언어의 구조체

C 언어의 구조체(struct)는 여러 개의 데이터 유형을 연속된 주소(바이트)의 집합으로 묶어서 새로운 데이터 유형을 정의한다. 구조체는 메모리 상에서 각 멤버 변수가 선언된 순서대로 연속적으로 배치됩니다.

패딩과 정렬

Untitled

메모리에 데이터를 저장할 때는 각 데이터 유형의 크기에 맞춰 정렬(alignment)하는 것이 일반적입니다. 컴파일러는 구조체 멤버 변수 사이에 패딩(padding)을 삽입하여 각 변수가 올바르게 정렬되도록 한다. → 에러를 줄일 수 있는 방법이다. 패딩을 이용해 정렬하지 않으면 성능이 저하된다.

구조체에서 가장 큰 자료형의 크기로 정렬된다. ex) char 로만 이루어져 있다면 패딩이 일어나지 않는다.