태그 보관물: memory

memory

포인터가 기본적으로 NULL로 초기화되지 않는 이유는 무엇입니까?

누군가 포인터가 초기화되지 않은 이유를 설명해 주 NULL시겠습니까?
예:

  void test(){
     char *buf;
     if (!buf)
        // whatever
  }

프로그램은 bufnull이 아니기 때문에 if 내부로 들어 가지 않습니다.

나는 왜 어떤 경우에 쓰레기가있는 변수, 특히 메모리의 쓰레기를 다루는 포인터가 필요한지 알고 싶습니다.



답변

우리 모두는 포인터 (및 기타 POD 유형)가 초기화되어야한다는 것을 알고 있습니다.
그러면 질문은 ‘누가 초기화해야 하는가’가됩니다.

기본적으로 두 가지 방법이 있습니다.

  • 컴파일러는이를 초기화합니다.
  • 개발자가 초기화합니다.

컴파일러가 개발자가 명시 적으로 초기화하지 않은 변수를 초기화했다고 가정 해 보겠습니다. 그런 다음 변수 초기화가 사소한 일이 아니고 개발자가 선언 지점에서이를 수행하지 않은 이유는 몇 가지 작업을 수행 한 다음 할당해야하기 때문입니다.

이제 컴파일러가 변수를 NULL로 초기화하는 코드에 추가 명령을 추가 한 다음 나중에 올바른 초기화를 수행하기 위해 개발자 코드가 추가되는 상황이 발생했습니다. 또는 다른 조건에서는 변수가 잠재적으로 사용되지 않습니다. 많은 C ++ 개발자는 추가 명령을 지불하고 두 가지 조건 모두에서 비명을 질렀습니다.

시간 문제가 아닙니다. 그러나 또한 공간. 두 리소스 모두 프리미엄이 있고 개발자도 포기하고 싶지 않은 많은 환경이 있습니다.

그러나 : 강제 초기화의 효과를 시뮬레이션 할 수 있습니다. 대부분의 컴파일러는 초기화되지 않은 변수에 대해 경고합니다. 그래서 저는 항상 경고 수준을 가능한 최고 수준으로 설정합니다. 그런 다음 컴파일러에게 모든 경고를 오류로 처리하도록 지시하십시오. 이러한 조건에서 대부분의 컴파일러는 초기화되지 않았지만 사용 된 변수에 대해 오류를 생성하여 코드 생성을 방지합니다.


답변

TC ++ PL에서 Bjarne Stroustrup 인용 (Special Edition p.22) :

기능의 구현은이를 필요로하지 않는 프로그램에 상당한 오버 헤드를 부과해서는 안됩니다.


답변

초기화에는 시간이 걸리기 때문입니다. 그리고 C ++에서 변수로 가장 먼저해야 할 일은 명시 적으로 초기화하는 것입니다.

int * p = & some_int;

또는:

int * p = 0;

또는:

class A {
   public:
     A() : p( 0 ) {}  // initialise via constructor
   private:
     int * p;
};

답변

C ++의 모토 중 하나는 다음과 같습니다.


당신은 당신이 사용하지 않는 것에 대해 지불하지 않습니다


바로 이러한 이유로, operator[]vector인덱스가 예를 들어, 범위 외에있는 경우 클래스는 확인하지 않습니다.


답변

역사적 이유로, 주로 이것이 C에서 수행되는 방식이기 때문입니다. C에서 그렇게 수행되는 이유는 또 다른 질문입니다. 그러나 제로 오버 헤드 원칙 이이 설계 결정에 어떻게 든 관련 되었다고 생각합니다 .


답변

게다가, 우리는 당신이 그것을 날려 버릴 때에 대한 경고를 가지고 있습니다 : 당신의 컴파일러에 따라 “값이 할당되기 전에 사용될 수 있습니다”또는 유사한 동사.

경고와 함께 컴파일하는 거 맞죠?


답변

변수가 초기화되지 않는 것이 합리적 일 수있는 상황이 거의없고 기본 초기화의 비용이 적습니다. 왜 그렇게합니까?

C ++는 C89가 아닙니다. C조차도 C89가 아닙니다. 선언과 코드를 혼합 할 수 있으므로 초기화 할 적절한 값이있을 때까지 선언을 연기해야합니다.