문제

정적 변수와 글로벌 변수 간의 차이를 알고 싶습니다. 액세스 속도 그리고 우주 소비. (내 플랫폼을 알고 싶다면 : Windows의 GCC 컴파일러.

(분명히 파일 및 기능 범위에서 이 질문)

편집하다: 마이크로 컨트롤러 / 프로세서 환경에 대한 답을 알려주세요.

도움이 되었습니까?

해결책

공간에는 차이가 없으며 같은 양을 취합니다.

그러나 속도 차이가 있습니다. 정적은 더 빠릅니다.

물론 변수에 대한 메모리 액세스는 전역 및 정적에 대한 것입니다. 그러나 컴파일러는 정적이있을 때 최적화 할 수 있습니다. 모듈을 컴파일하면 모듈 외부의 함수에 대한 함수 호출이 정적 변수를 변경할 수 없음을 알고 있습니다. 따라서 정확히 무슨 일이 일어나는지 정확히 알고 예를 들어 기능 통화에 대한 레지스터에 보관할 수 있습니다. 글로벌이고 다른 모듈에서 함수를 호출하면 컴파일러는 그것이 무엇을하는지 알 수 없습니다. 따라서 그는 함수가 변수에 액세스하고 변경하여 상점과 재 장전을 초래한다고 가정해야합니다.

GCC를 사용하면 모든 것을 통과 할 수 있습니다 .c 소스는 동시에 소스가 있으므로 다른 모듈의 함수에 대한 기능 호출에서 발생하는 작업도 볼 수 있습니다. 작동하게하려면 모든 것 외에 통과해야합니다. .c 한 번에 파일 -combine 그리고 -fwhole-program. 그만큼 -fwhole-program 모든 글로벌을 정적으로 정적으로 만듭니다 (모듈이 아니라 컴파일 장치가 정적, 즉 모든 주어진 .c 함께 파일). 그만큼 -combine 인터 모드 분석을 만듭니다.

다른 팁

공간 소비 : 기본적으로 차이가 없습니다. 공간 문제가있는 유일한 시간은 N 객체 파일에 숨겨진 동일한 정적 데이터 덩어리를 얻을 수 있다면 단일 글로벌 피스 인 경우 1 개의 사본이있는 경우 N의 곱셈 계수를 얻는 것입니다. 데이터의. 그러나 그것은 잘못 디자인 문제입니다. 정보 숨기기는 양호합니다 - 정보가 숨겨져서는 안된다면.

액세스 속도 : 차이가 없습니다.

추측하거나 추정하기가 어렵습니다. 아마 시간이 걸리지 만 샘플 프로젝트를 만들고 속도를 테스트 할 것입니다. 루프로 액세스 속도와 공간을 모두 테스트합니다. 해당 아키텍처에 대한 에뮬레이터로 샘플 프로젝트를 테스트하십시오.

나는 어떤 차이가 포장 (공간)과 캐싱 (속도) 문제와 비롯 될 것으로 예상합니다. 두 가지 모두 다른 어떤 것도 발생할 수도 있습니다.

거기 있습니다 차이 없음 환경에서 당신은 그것이있을 때를 설명합니다 우주. 정적 또는 글로벌 var는 동일한 양의 메모리를 소비합니다.

을 위한 속도 고려 사항 (그러나 좋은 연습은 아닙니다) 당신은 할 수 있습니다 글로벌 vars를 선호합니다, 하나의 파일 외부 VAR에 액세스 해야하는 경우. (참조 사용 external char my_global_char_placed_else_where;)

더 나은 연습을 위해서는 대신 Get/Set 기능을 사용하지만 느리게됩니다. 그러면 VAR이 실제로 전 세계적이라는 코드의 독자로부터 숨기기 위해 전 세계적 인 VAR의 get/set에 매크로를 사용할 수 있지만 부정 행위를 좋아합니다. 그러나 코드를 더 읽기 쉽게 만들 수 있습니다.

함수 내부에 VAR을 숨기는 것을 비교하면 함수 외부에 배치하는 것과 비교하여 차이가 없으며 더 많은 함수가 var에 액세스 할 수 있습니다.

직접 MSP430, ARM7 (테스트 용) 및 AVR32 MICROS를 개발합니다.

조나단의 말은 정확히 정확하지 않습니다. 정적 및 글로벌 변수는 모두 Zi (또는 RW 데이터) 영역에서 저장됩니다. 컴파일러는 레지스터를 엄격하게 "보관"할 수 없습니다. 할 수있는 일은 값을 레지스터에로드하고 모든 작업에 해당 레지스터를 사용하고 해당 값을 다시 저장하는 것보다 컴파일러 별 최적화입니다. 그럼에도 불구하고 컴파일러가 글로벌 변수에 대해서도 그렇게하지 않는 이유는 없습니다. 그러나 기술적으로 정적 변수 휘발성을 만들 수 있으므로 차이가 없습니다.

편집 : 오 예 - 공간 : 차이가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top