메모리 레이아웃은 컴퓨터의 메모리가 어떻게 구성되고 구조화되어 있는지를 나타냅니다. 다양한 시스템 구성 요소에서 메모리를 분할하고 활용하는 방법을 정의합니다.
이는 실행 중에 변수, 함수 및 데이터 구조가 저장되고 액세스되는 방식에 직접적인 영향을 미치기 때문에 C에서 매우 중요합니다.
이 기사에서 C에서 메모리 레이아웃의 기본 측면에 대해 알아봅니다.
C의 메모리 레이아웃은 다양한 세그먼트로 구성됩니다. 아래는 세그먼트입니다.
아래 다이어그램은 C의 메모리 레이아웃을 보여줍니다.
이제 세그먼트에 대해 자세히 논의해 보겠습니다.
텍스트 세그먼트는 컴파일된 기계어 명령어를 저장하는 C 프로그램의 메모리 영역입니다. 이러한 지침은 프로그램의 실행 가능한 논리를 구성하며 해당 동작을 정의합니다.
다음은 C 프로그램의 텍스트 세그먼트 개념을 설명하는 간단한 예입니다.
#include <stdio.h> 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 <stdio.h> // 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 <stdio.h> // 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 <stdio.h> #include <stdlib.h> 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 <stdio.h> 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; }
The code explains how stack frames store local variables. New stack frames are created by the function calls and are eliminated when the functions return. The printf instructions facilitate the visualization of each function's local variable values. The execution flow follows the calls to and returns from functions.
C programmers can improve their coding techniques and gain a better understanding of how their programs interact with memory by mastering these concepts. Understanding memory layout is a vital skill in your programming toolbox, whether you're optimizing for performance or troubleshooting a complex problem.
Feel free to follow, comment, and leave claps. Happy Coding!
Let’s connect on LinkedIn.
위 내용은 C의 메모리 레이아웃의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!