"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C의 메모리 레이아웃

C의 메모리 레이아웃

2024-08-17에 게시됨
검색:342

소개

메모리 레이아웃은 컴퓨터의 메모리가 구성되고 구성되는 방식을 나타냅니다. 다양한 시스템 구성 요소에서 메모리를 분할하고 활용하는 방법을 정의합니다.

이는 실행 중에 변수, 함수 및 데이터 구조가 저장되고 액세스되는 방식에 직접적인 영향을 미치기 때문에 C에서 매우 중요합니다.

이 도움말에서는 C에서 메모리 레이아웃의 기본 측면에 대해 알아봅니다.

C 메모리 레이아웃의 세그먼트

C의 메모리 레이아웃은 다양한 세그먼트로 구성되며, 아래는 세그먼트입니다.

  1. 텍스트(코드) 세그먼트.
  2. 데이터 세그먼트.
  3. 더미.
  4. 스택.

아래 다이어그램은 C의 메모리 레이아웃을 보여줍니다.

Diagram of C’s memory layout.
이제 세그먼트에 대해 자세히 논의해 보겠습니다.

텍스트(코드) 세그먼트

텍스트 세그먼트는 컴파일된 기계어 명령어를 저장하는 C 프로그램의 메모리 영역입니다. 이러한 명령어는 프로그램의 실행 가능한 논리를 구성하고 해당 동작을 정의하는 역할을 합니다.

다음은 C 프로그램의 텍스트 세그먼트 개념을 설명하는 간단한 예입니다.

#include 

int main() {
    int x = 5;
    int y = 10;
    int sum;

    sum = x   y;
    printf("The sum of %d and %d is %d\n", x, y, sum);

    return 0;
}

컴파일러는 이 프로그램이 컴파일될 때 소스 코드를 기계어 코드로 변환합니다. 이 기계어 코드는 프로그램의 논리와 동작을 구성하며 텍스트 세그먼트에 저장됩니다.

기계 코드를 직접 볼 수는 없지만. 텍스트 세그먼트에 컴파일된 지침이 포함되어 있음을 이해할 수 있습니다.

기본적으로 텍스트 세그먼트에는 프로그램이 실행될 때 동작하는 방식을 정의하는 지침이 포함됩니다.

데이터 세그먼트

데이터 세그먼트는 두 부분으로 나뉩니다.

  • 초기화된 데이터 세그먼트
  • 초기화되지 않은 데이터 세그먼트

초기화된 데이터 세그먼트

초기화된 데이터 세그먼트는 미리 초기화된 전역, 외부, 정적(로컬 및 전역 모두) 및 상수 전역 변수로 구성됩니다. 초기화된 데이터 세그먼트에는 읽기 전용읽기-쓰기 섹션이라는 두 개의 섹션이 있습니다.

수정될 수 있는 미리 정의된 값이 있는 변수, 즉 초기화된 전역, 외부 및 정적(로컬 및 전역) 변수는 읽기-쓰기 섹션에 저장됩니다. 반면에 상수 변수는 읽기 전용 섹션에 있습니다.

다음은 읽기-쓰기 및 읽기 전용 섹션 모두에서 초기화된 데이터 세그먼트에 저장된 변수를 보여주는 예입니다.

#include 

// Global variable (read-write section)
int globalVar = 10;

// External variable declaration (read-write section)
extern int externVar;

// Static global variable (read-write section)
static int staticGlobalVar = 20;

// Constant global variable (read-only section)
const int constGlobalVar = 30;

int main() {
    globalVar  = 5;
    staticGlobalVar  = 10;

    printf("Global variable: %d\n", globalVar);
    printf("Extern variable: %d\n", externVar);  // Assuming externVar is defined in another file
    printf("Static global variable: %d\n", staticGlobalVar);
    printf("Constant global variable: %d\n", constGlobalVar);

    return 0;
}

초기화된 데이터 세그먼트의 읽기-쓰기 및 읽기 전용 섹션에 저장된 변수를 보여줍니다.

초기화되지 않은 데이터 세그먼트

BSS(Block start by Symbol) 세그먼트라고도 하는 초기화되지 않은 데이터 세그먼트는 초기화되지 않은 전역, 외부 및 정적(로컬 및 전역) 변수로 구성됩니다.

이러한 변수는 프로그램 실행 전에 기본적으로 0으로 초기화됩니다. 읽기-쓰기 권한이 있습니다. 따라서 프로그램 실행 중에 이를 읽고 쓸 수 있습니다.

예:

#include 

// Uninitialized global variable (goes to the BSS segment)
int globalVar;

// Uninitialized static global variable (also goes to the BSS segment)
static int staticGlobalVar;

int main() {
    // Uninitialized local static variable (goes to the BSS segment)
    static int staticLocalVar;

    printf("Uninitialized Global Variable: %d\n", globalVar);
    printf("Uninitialized Static Global Variable: %d\n", staticGlobalVar);
    printf("Uninitialized Static Local Variable: %d\n", staticLocalVar);
    return 0;
}

이 프로그램에서 초기화되지 않은 변수에는 기본적으로 0 또는 null 값이 포함됩니다. 이는 컴파일러에 의한 자동 초기화 때문입니다. 이는 BSS 세그먼트에 저장된 변수의 동작을 보여줍니다.

더미

힙은 런타임 중 동적 메모리 할당에 사용되는 메모리 영역입니다. 이를 통해 프로그램 실행 중에 필요에 따라 메모리를 할당하고 해제할 수 있습니다. malloc(), calloc(), realloc(), free()와 같은 함수는 메모리 할당 및 할당 해제에 사용됩니다. 힙에. 힙은 프로그램의 모든 부분에서 액세스할 수 있습니다.

예:

#include 
#include 

int main() {
    // Dynamically allocate memory for an integer variable on the heap
    int *ptr = (int *)malloc(sizeof(int));

    return 0;
    }

이 코드 조각은 C에서 동적 메모리 할당을 간단하게 사용하는 방법을 보여줍니다. 메모리 요청, 해당 메모리에 대한 포인터 초기화, 누수 방지를 위한 적절한 메모리 관리와 관련된 단계에 주목합니다. 이 예제에는 오류 처리 및 메모리 할당 해제가 포함되어 있지 않지만 실제 애플리케이션에서 동적 메모리를 사용하는 데 중요한 구성 요소입니다.

스택

스택 세그먼트의 주요 기능은 함수 호출을 관리하고 지역 변수를 저장하는 것입니다. 이 부분은 프로그램 내의 흐름을 제어하므로 프로그램의 메모리 레이아웃에서 매우 중요합니다. 스택은 LIFO(Last In, First Out) 구조를 채택합니다. 즉, 가장 최근에 추가된 데이터가 먼저 제거됩니다. 이는 지역 변수 및 중첩 함수 호출을 관리하는 데 스택을 매우 효율적으로 만듭니다.

예:

#include 

void functionA(int n) {
    int a = n   1; // Local variable
    printf("In functionA, a = %d\n", a);
}

void functionB() {
    int b = 10; // Local variable
    printf("In functionB, b = %d\n", b);
    functionA(b); // Call to functionA
}

int main() {
    int x = 20; // Local variable
    printf("In main, x = %d\n", x);
    functionB(); // Call to functionB
    return 0;
}

이 코드는 스택 프레임이 지역 변수를 저장하는 방법을 설명합니다. 새로운 스택 프레임은 함수 호출에 의해 생성되고 함수가 반환될 때 제거됩니다. printf 명령어는 각 함수의 지역 변수 값을 시각화하는 데 도움을 줍니다. 실행 흐름은 함수 호출과 함수 반환을 따릅니다.

결론

C 프로그래머는 이러한 개념을 숙지함으로써 코딩 기술을 향상시키고 프로그램이 메모리와 상호 작용하는 방식을 더 잘 이해할 수 있습니다. 메모리 레이아웃을 이해하는 것은 성능을 최적화하든 복잡한 문제를 해결하든 프로그래밍 도구 상자에서 필수적인 기술입니다.

자유롭게 팔로우하고 댓글을 달고 박수를 보내주세요. 즐거운 코딩하세요!

LinkedIn에서 연결해 보세요.

릴리스 선언문 이 글은 https://dev.to/hyoukarh/memory-layout-in-c-399a에서 복제되었습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제해 주시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3