>

저는 C ++을 처음 접했고 처음부터 당신이 할 수없는 일을 시작했습니다.

int x;
cin >> x;
int array[x];

대신 동적 메모리를 사용해야합니다. 그러나 최근에 위의컴파일이 있음을 발견했습니다 (ISO C ++에서 금지하고 있다는 경고 메시지가 나타납니다). 표준에서 허용하지 않는 경우에는 그렇게하는 것이 좋지 않다는 것을 알고 있지만 이전에는 이것이 가능하다는 것을 몰랐습니다.

내 질문은 왜 g ++이 표준에서 허용하지 않으면 동적으로 할당되지 않는 가변 길이 배열을 허용합니까? 또한, 컴파일러가 그렇게 할 수 있다면, 표준에서그렇지 않은 이유는 무엇입니까?

  • 답변 # 1

    가변 길이 배열 (VLA)에 대한 지원이 C99의 C 언어에 추가되었습니다.

    그들에 대한 지원이 gcc (C99를 지원하기 위해)에 있기 때문에, 그것들에 대한 지원을 g ++에 추가하는 것은 비교적 간단했다.

    이것은 구현 고유의 언어 확장이며 코드를 이식 가능하게하려면 구현 고유의 확장을 사용하는 것은 좋지 않습니다.

  • 답변 # 2

    C99에서 지원되기 때문입니다. 왜 이것이 C ++ 표준에 없는지에 대해서는 말할 수 없습니다. 그러나 (주의하지 않으면) 오버플로를 쉽게 이끌어 낼 수 있기 때문에 생각보다 유용하지 않습니다 (일반적으로 alloca를 기반으로하기 때문에 표준은 아니기 때문에). 또 다른 실수는 즉시 동적 범위를 벗어나는 동적 배열에 대한 포인터를 반환하는 것입니다.

  • 답변 # 3

    많은 컴파일러가 표준을 수용하고 확장합니다. 두 가지 기본 이유가 있습니다 :

    <올>

    사악한 컴파일러 작성자는 아마도 컴파일러에서 멀어 지도록 만드는 것이 수명을 연장시키는 데 도움이된다고 생각합니다.

    유능한 컴파일러 작성자는 아마도 적은 비용으로도 무료로 더 많은 옵션을 제공하는 것이 좋은 것이라고 생각합니다.

  • 답변 # 4

    C에있는 것으로 언급 된 모든 이유는 정확하지만 요구 사항에는 제한이 있습니다. 예를 들어 C에서 필요한 것보다 더 유연한 지원을 보여줄 수 있습니다 (cin 대신 scanf를 사용하여 구현 한 경우 .c 파일에 넣고 gcc를 사용하십시오).

    이것은 스택 포인터를 줄이고 (스택 크기를 늘리는) alloca (할당량 자동)에 대한 암시 적 호출에 불과하며 할당 된 메모리에 대한 포인터로 사용되는 다른 레지스터에 새 스택 포인터를 복사합니다.

    차이는 alloca로 생성 된 객체에서 생성자와 소멸자가 호출되지 않는다는 것입니다.

  • 이전 python - 객체 및 기본 유형 할당
  • 다음 java - 메소드 서명 모범 사례 - 오버로드와 긴 이름