2010-12-04 1 views
3

전역 변수를 사용하면 실행 파일의 크기가 증가합니까? 그렇다면 어떻게? 데이터 섹션 크기 또는 텍스트 섹션 크기 만 증가합니까?전역 변수는 실행 파일의 크기에 어떻게 기여합니까?

나는 아래와 같이 전역 변수 초기화가있는 경우 : 이제

char g_glbarr[1024] = {"jhgdasdghaKJSDGksgJKASDGHKDGAJKsdghkajdgaDGKAjdghaJKSDGHAjksdghJKDG"}; 

을,이 데이터 섹션에 1024을 추가 않으며,시 초기화 문자열의 크기가 섹션을 텍스트로?

만약이 배열을위한 공간을 정적으로 할당한다면, malloc하고 memcpy를 수행하면 데이터 섹션 크기 만 줄이거 나 텍스트 섹션 크기도 줄어들 것입니다.

답변

5

예. 기본적으로 컴파일러는이를 데이터 세그먼트에 저장합니다. 경우에 따라 코드에서 상수 char 배열 (예 : printf("<1024 char array goes here");)을 사용하면 데이터 세그먼트 (일부 이전 컴파일러/Borland? /는 텍스트 세그먼트에 저장할 수 있음)로 이동합니다. 컴파일러가 전역 변수를 사용자 정의 섹션에 넣도록 강제 할 수 있습니다 (VC++의 경우 #pragma data_seg(<segment name>)).

동적 메모리 할당은 힙에 메모리를 할당하므로 데이터/텍스트 세그먼트에 영향을주지 않습니다.

2

저는 전문가로서 말하고 있지는 않지만 단순히 프로그램에서 서사시적인 문자열 리터럴을 사용하면 실행 파일의 크기가 커집니다. 이 문자열 리터럴로하는 일은 중요하지 않습니다. 왜냐하면 어딘가에에 저장해야하기 때문입니다.

실행 파일의 "섹션"이 증가하는 이유는 무엇입니까? 이것은 수사학적인 질문이 아닙니다!

+1

문자열 리터럴 **은 ** 아무 곳에서나 실제로 사용되지 않는 경우 ** 제거 될 수 있습니다 **. –

+0

문자열 리터럴은 단지 예일뿐입니다. 구조체 배열 일 수 있고 문자열, 정수 등으로 초기화 될 수있는 전역 변수가 많이있을 수 있습니다. malloc을 사용하여 전역 변수에 메모리를 할당하면 크기가 줄어 듭니다. – Jay

+0

"실행 파일의"섹션 "이 증가한 이유는 무엇입니까? - 일이 어떻게 작동하는지 더 깊이 이해하는 것이 중요합니다. – Jay

1

대답은 약간 구현에 민감하지만 일반적으로 아니오입니다. g_glbarr은 실제로 char 또는 주소에 대한 포인터입니다. 문자열 자체는 상수 문자열을 사용하여 데이터 섹션에 저장되며 g_glbarr은 컴파일 타임에 문자열 주소에 대한 심볼이됩니다. 당신은 포인터를위한 공간을 할당하는 것을 끝내지 않고 컴파일러는 단순히 링크시에 주소를 결정합니다.

업데이트

@Jay, 그것은 그렇다고 좀 동일합니다. 정수는 (보통) 단지 인라인입니다. 컴파일러는 상수를 코드에 넣을 수있을만큼 가깝습니다. 왜냐하면 대부분의 일반 아키텍처가 즉각적인 데이터에서 직접 수행하는 일반적인 방법이기 때문에 코드에 상수를 넣을 수 있습니다. 문자열 상수는 여전히 일부 읽기 전용 데이터 섹션에 있습니다. 그래서 당신이 뭔가 같이 할 때 다음 1이된다

// warning: I haven't compiled this and wouldn't normally 
// do it quite this way so I'm not positive this is 
// completely grammatical C 
struct X {int a; char * b; } x = { 1, "Hello" } ; 

"즉시"데이터는 "Hello" 어딘가에 읽기 전용 데이터에 할당되고, 컴파일러는 읽기 - 쓰기 데이터의 조각을 할당 무언가를 생성 할 것 STR42 메모리에 문자열 "Hello"의 위치에 대한 상징적 인 이름입니다

x: 
x.a: WORD 1 
x.b WORD @STR42 

같이 보입니다. 모든 것이 함께 연결되면 @STR42은 메모리에있는 문자열의 실제 가상 주소로 바뀝니다.

+0

주셔서 감사합니다. 그러나 배열 구조를 사용하고 정수와 문자열로 초기화 할 때 어떤 일이 발생합니다. 그것도 같은 방식으로 작동합니까? – Jay

3

대답은 구현에 의존하지만, 제정신 구현이는 (그렇지 않으면 전역 또는) 정적 저장 기간과 변수를 작동하는 방법이다 : 변수가 초기화 될 때마다 전체의 값을 초기화

  • 개체는 실행 파일에 저장됩니다. 이것은 초기 부분 만 명시 적으로 초기화 된 경우에도 적용됩니다 (나머지는 암시 적으로 0 임).
  • 변수가 상수이고 초기화 된 경우 "텍스트"세그먼트 또는 이와 동등한 변수에 저장됩니다. 일부 시스템 (현대 ELF 기반, 아마도 Windows?)에는 프로그램 코드와 별도로 실행 불가능한 것으로 표시 될 수 있도록 읽기 전용 데이터 용 별도의 "rodata"세그먼트가 있습니다.
  • 상수가 아닌 초기화 된 변수는 실행 파일의 "데이터"세그먼트에 있으며 프로그램이로드 될 때 운영 체제에 의해 쓰기 복사 모드로 메모리에 매핑됩니다.
  • 초기화되지 않은 변수 (표준에 따라 암시 적으로 0 임)는 실행 파일 자체에 예약 된 저장소가 없지만 운영 체제에서 프로그램을로드 할 때 만들어지는 "bss"세그먼트의 크기와 오프셋입니다.
  • 이러한 초기화되지 않은 변수 const- 인증 인 경우 별도의 읽기 전용 "bss"와 같은 세그먼트로 만들어집니다.