2012-04-17 3 views
7

전체 프로그램의 특정 개체에 대한 정적 개체 초기화 순서를 보장 할 수있는 방법이 있습니까? 나는 프로그램 전체에서 어디에서나 사용될 것이므로 나중에 할당자를 사용하여 나중에 모든 메모리를 할당하기 위해 프로그램의 첫 번째 항목으로 할당하고자하는 메모리 할당자를 가지고 있습니다.컴파일러 관련 메모리 초기화

나는 이것이 C++ 표준이 이것을 허용하지 않는다고 생각하여 아마도 컴파일러마다 다르다는 것을 알고 있습니다. 이 작업에 관심이있는 두 개의 컴파일러는 gcc와 VS2010의 컴파일러입니다. 방법이 있다면 누군가가 어떻게 설명 할 수 있을까요?

편집 나는 할당 자 내가 프로그램 시작시 초기화하려는 큰 메모리 블록을 할당되기 때문에 "처음 사용할 때 구성"원하지 않는

.

+1

"정적 객체 초기화 순서를 보장 하시겠습니까?"또는 무엇을 의미합니까? – Griwes

+1

왜 누군가가 downvote 했습니까? – chadb

+5

질문을 다시 작성하는 것이 좋습니다. 그것이 의미가 없기 때문에 – Grizzly

답변

7

컴파일러 관련 지시문을 사용하여 초기화 순서에 다소 영향을 줄 수 있습니다. MSVC에는 특정 모듈에 대한 우선 순위를 다소 설정할 수있는 플러그 프라임

#pragma init_seg({ compiler | lib | user | "section-name" [, func-name]}) 

이 있습니다. init_seg에 대한 참조를 참조하십시오.

gcc 컴파일러는 상대 특정 초기화의 우선 순위를 설정하는 것과 유사한/관련 속성 구문을 가지고 있습니다. 모양은

Some_Class A __attribute__ ((init_priority (2000))); 
Some_Class B __attribute__ ((init_priority (543))); 

이며이 페이지의 내용은 init_priority입니다.

+1

매우 흥미 롭습니다. MSVC에 대해 Some_Class를 수행하는 방법에 대한 예제를 제공 할 수 있습니까? – josephthomas

+1

@Bo Persson : MSVC에 대해 Some_Class의 예를 보여줄 수 있습니까? 문서를 읽은 후에 Some_Class A와 비슷한 것을 볼 수는 없습니다 (가능하다고 믿을지라도 문서에서 말하는 것입니다. 그러나 그것을 성취 할 수없는 것 같습니다). – chadb

+0

MSVC에 대해 정확히 동일한 기능을 사용할 수 없습니다. 'Some_Class'의 객체를 초기화하는 파일에'#pragma init_seg (lib)'를 추가하여 사용자 코드 전에 초기화 될 수 있습니다. 각 개체에 대해 정확한 우선 순위를 얻을 수 없습니다. –

0

나는 정적 변수가 다른 정적 변수의 상태에 따라 초기화 될 때 프로그램이 정의되지 않은 동작을 호출 할 수있는 정적 초기화 순서 실패를 언급하고 있다고 생각합니다. 당시 생성자를 호출했다).

이 문제에 대한 해결 방법은 여기에 C++ FAQ에 설명 된 처음 사용 관용구에 구조는 다음과 같습니다

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.15

+0

이전에 살펴 보았지만 할당자가 프로그램 시작시 초기화 할 큰 메모리 블록을 할당하기 때문에 "처음 사용할 때 구성"을 원하지 않습니다. – chadb

+1

@chadb : 아마도 당신이하는 일에 대해 더 자세히 설명해야합니다. 귀하의 질문에 나는 완벽하게 괜찮아요 (첫 번째 사용 정적 개체의 건설 내부에있을 수 있습니다)에 처음 사용에 건설을 가정하기 때문에. – Grizzly

+0

그래서 첫 번째 이니셜 라이저가 메모리 할당 트리거를 사용하려고합니다. – ams

0

대신 정적 초기화를 제어하기 위해 노력, 의지 만 원인 당신 시간 나중에 더 우스운 디버깅 시간을 갖기 시작하면 main의 시작 부분에 메모리 풀을 할당하십시오. 그런 다음 정적 초기화의 모든 함정이없는 사전 할당 된 메모리를 얻습니다.

+0

main보다 먼저 실행되고 문제의 메모리에 의존하는 모든 정적 초기화 프로그램에는 약간 늦습니다. – ams

+0

하버드 아치. 프로세서는 프로그램 메모리에 데이터를 저장하기 위해 정적 초기화가 필요할 수 있으며 일반적으로 AVR uC의 플래시 메모리 만 읽습니다. 을 읽기 전용 메모리로 사용하면 런타임에 할당하거나 초기화 할 수 없습니다. –

관련 문제