data segment에는 initialized data segment와 uninitialized data
segment가
있는데...
bss는 uninitialized data segment를 흔히 일컨는 말입니다.
이 bss 영역의
값들은 kernel에 의해 artimethic 0 or null pointer 로
프로그램이 시작하기 전에 초기화가 됩니다.
bss섹션에 있는 내용은 말씀하신바와 같이 초기화되지 않은 global데이터가
할당되는 부분입니다.
또한 Data
Section은 말씀하신바와 같이 초기화된 global데이터가 할당됩니다
bss섹션은 RAM에 해당 영역만큼의 공간만을 잡아주면 되지만, data section은
RAM을 할당할 뿐만 아니라
해당데이터의 초기 값을 지니고 있을 ROM또한
할당되어야 합니다. (Embedded에서 그렇습니다.)
따라서, bss영역은 초기화 과정(crt0)에서 컴파일러에서 지정한 초기화 방식에
의하여 초기화되며, data부분은 ROM에 있는
초기화된 데이터를 해당 data영역으로
복사함으로서 수행하게 됩니다.
장/단점이란것은 존재하지 않습니다. 사용자의 의도에 의하여 정의되는
것이겠지요..
즉, 초기값이 필요하냐.. 초기값이 필요하지
않느냐에 따라 틀려지겠습니다.
굳이 장단점을 따지자면, 초기화된 global data는 ROM의 영역을 할당해야 되고,
데이터 copy를 이용하므로, 조금 더
메모리를 잡아먹고.. 조금 더 초기화에
시간이 걸리겠지요..
여기서보면..결국 bbs에 초기화안된 global , data secion에 초기화된 global
#include <stdio.h>
#include <calloc.h>
int a; // bss
int b = 10; // data
static int c; // bss
int main(void)
{
int x1; // stack
int x2 = 100; //
stack
static int y1; // bss
static int z2 = 200; // data
int
*arr/*stack*/ = malloc(100); /* heap 즉 arr 변수 자체는 stack에 저장되며, 100 만큼의 메모리는
heap영역에 생긴다. */
return 0;
}
trackback from: CR7Ronaldo의 생각
답글삭제bss segment data segment에는 initialized data segment와 uninitialized data segment가 있는데… bss는 uninitialized data segment를 흔히 일컨는 말입니다. 이 bss 영역의 값들은..