2014-12-23 4 views
1

나는 2010 ++ VC에 다음 코드를했다 :올바르게 배열의 값을 0으로 초기화 하시겠습니까?

PWCHAR pszErrorMessage = new WCHAR[100]; 

이 코드는 배열에 문자 포인터를 초기화합니다. 그러나 배열의 값은 가비지입니다. 값을 0으로 설정하는 방법이 필요했습니다. 위의 값을 위의 값으로 변경하면 배열의 모든 값이 0으로 설정됩니다. 이것은 사용자 정의 구조 배열에도 적용됩니다.

PWCHAR pszErrorMessage = new WCHAR[100](); 
  1. 이 맞습니까?
  2. 성능에 미치는 영향이 있습니까?
  3. 이 유형의 배열 초기화는 VC++ 2005의 일부였습니까?
  4. 배열의 struct 값을 0으로 설정하기 위해 내부적으로 호출 된 메서드는 무엇입니까?
+1

기본 질문은 [이 사람]의 거의 속는 (http://stackoverflow.com/q/620137/179910),하지만 그건 당신이 물어 구현 세부 사항의 일부를 포함하지 않습니다 약. –

+0

@JerryCoffin 나는 당신이 연결된 대답이 내가 가지고있는 주된 질문에 답하는 것 같아요. adding() 제로가 값을 초기화하는지 여부. VC++ 2010은 C++ 2003 호환 컴파일러라고 가정합니다. –

+0

VC++ 2010은 이와 관련하여 C++ 2003을 준수합니다 (다른 일부에서는 그렇지 않습니다). –

답변

1

로서는 예 괄호 명시 멤버를 초기화하는 기본 생성자를 정의하는 유형의 (NULL 포인터 등 및 포인터) 산술 0으로 초기화한다 유형 수단 값 초기화를 강제 elsewhere 주목 , 이것은 아무런 차이를 만들지 않을 것입니다 - 왜냐하면 괄호가 포함되어 있든 없든 기본 생성자가 호출되기 때문입니다.

예, 성능에 다소 영향을 미칠 수 있습니다. 특히 메모리를 초기화하는 데 시간이 오래 걸릴 수 있습니다. 특히 많은 양을 할당하는 경우 특히 그렇습니다. 은 항상이 아닙니다. 멤버를 초기화 한 기본 ctor를 사용하여 객체 유형을 할당하는 경우 해당 ctor는 어느 쪽이든 사용됩니다.

이 기능은 C++ 03 표준에 추가되었습니다. Offhand, VC++ 2005에 구현되었는지 여부는 기억하지 못합니다. VC++ 개발자 블로그를 통해 빠른 검색을 시도했지만 VC++ 2005의 출시 이후 버전입니다. VC++ 2005 SP1에 대한 정보는 포함되어 있지 않습니다.

최소한 내가 생성 한 코드를 살펴보면 할당 된 버퍼를 0으로 만드는 코드는 적어도 char과 같은 간단한 유형의 경우 인라인으로 할당 된 것으로 보입니다. 예를 들어 :

xor eax, eax 
mov rcx, QWORD PTR $T86268[rsp] 
rep stosb 
+0

테스트에서 컴파일러가 메모리를 최적화하지 않았습니까? 이 방법으로 배열을 할당하고 모든 요소에 액세스하는 것은 디스 어셈블리 창 (VS 2013)에서 [memset 호출] (http://pastebin.com/ea2F3UYH)을 표시합니다. – dewaffled

+0

@frymode : 예, 아니오. 그것은 메모리를 0으로 만드는 것을 최적화하지 않았습니다. 컴파일러의 차이점을 감안할 때 VC++ 2010의 64 비트 컴파일러를 사용했고 VC++ 2013의 32 비트 컴파일러를 사용했을 것입니다. 생성 된 코드의 일부 차이는 상당히 놀랍습니다. –

관련 문제