(배경 : C 및 C ++ 컴파일러 구현 경험이 있습니다.)
C99의 가변 길이 배열은 기본적으로 잘못된 단계였습니다. VLA를 지원하기 위해 C99는 상식적으로 다음과 같은 양보를해야했습니다.
sizeof x
더 이상 항상 컴파일 타임 상수는 아닙니다. 컴파일러는 때때로 sizeof
런타임에 -expression 을 평가하기위한 코드를 생성해야합니다 .
2 차원 VLA ( int A[x][y]
)를 허용 하려면 2D VLA를 매개 변수로 사용하는 함수를 선언하는 새로운 구문이 필요했습니다 void foo(int n, int A[][*])
.
덜 중요한 것은 C ++ 세계 있지만 받기를 갈망 VLA 수단 선언, 임베디드 시스템 프로그래머 C의 타겟 고객을위한 매우 중요한에서 임의의 큰 당신의 스택의 덩어리를. 이는 스택 오버플로 및 충돌을 보장 합니다. (언제든지 선언 할 때 int A[n]
, 2GB의 스택이 남을 것이라고 암시 적으로 주장합니다. 결국 " n
여기에서 확실히 1000보다 작습니다 "를 알고 있다면을 선언하면 int A[1000]
됩니다. 32 비트 정수 n
를 대체하는 1000
것은 입학 프로그램의 동작이 무엇인지 모릅니다.)
자 이제 C ++에 대해 이야기하도록하겠습니다. C ++에서, 우리는 "타입 시스템"과 "가치 시스템"사이에 C89와 같은 강력한 차이점이 있습니다. 예를 들면 다음과 같습니다.
template<typename T> struct S { ... };
int A[n];
S<decltype(A)> s; // equivalently, S<int[n]> s;
n
컴파일 타임 상수가 아닌 경우 (즉, A
가변적으로 수정 된 유형 인 경우) 지구상의 유형은 S
무엇입니까? 겠습니까 S
의 유형은 또한 실행시에 결정된다?
이건 어때?
template<typename T> bool myfunc(T& t1, T& t2) { ... };
int A1[n1], A2[n2];
myfunc(A1, A2);
컴파일러는의 인스턴스화를위한 코드를 생성해야합니다 myfunc
. 그 코드는 어떻게 생겼습니까? A1
컴파일 타임 의 유형을 모르는 경우 어떻게 정적으로 코드를 생성 할 수 있습니까?
더 나쁜, 무엇을 런타임에 밝혀지면 그 n1 != n2
, 그래서 !std::is_same<decltype(A1), decltype(A2)>()
? 이 경우 템플릿 유형 공제가 실패하기 때문에에 대한 호출 myfunc
은 컴파일되지 않아야합니다! 런타임에 어떻게 그 동작을 에뮬레이트 할 수 있습니까?
기본적으로 C ++은 템플릿 코드 생성, 함수 평가 등과 같이 점점 더 많은 결정을 컴파일 타임 으로 추진하는 방향으로 나아가고 constexpr
있습니다. 한편, C99는 전통적으로 컴파일 타임 결정 (예를 들어 sizeof
)을 런타임 으로 추진하는 데 바빴습니다 . 이를 염두에두고 C99 스타일 VLA를 C ++에 통합 하려는 노력 을 기울이는 것이 합리적 일까요?
다른 모든 응답자가 이미 지적했듯이 C ++은 "필요한 RAM의 양을 전혀 모른다"라는 아이디어를 전달하고자 할 때 많은 힙 할당 메커니즘 ( std::unique_ptr<int[]> A = new int[n];
또는 std::vector<int> A(n);
명백한 메커니즘 )을 제공합니다. 그리고 C ++은 필요한 RAM의 양이 RAM의 양보다 큰 불가피한 상황을 처리하기위한 멋진 예외 처리 모델을 제공합니다. 그러나이 답변 이 C99 스타일 VLA가 C ++에 적합 하지 않은 이유와 C99에 적합 하지 않은 이유에 대한 좋은 아이디어를 제공하기를 바랍니다 . ;)
이 주제에 대한 자세한 내용은 Vjar에 대한 Bjarne Stroustrup의 2013 년 10 월 백서 인 N3810 "어레이 확장을위한 대안"을 참조하십시오 . Bjarne의 POV는 나와 다릅니다. N3810은 사물에 대한 좋은 C ++ ish 구문 을 찾고 C ++ 에서 raw arrays를 사용하지 않는 데 중점을 두는 반면 메타 프로그래밍 및 형식 시스템에 대한 의미에 더 중점을 두었습니다. 그가 메타 프로그래밍 / 유형 시스템의 함의를 풀거나 해결할 수 있거나 단순히 흥미롭지 않은 것으로 간주하는지 모르겠습니다.
이와 같은 여러 가지 요점을 다루는 좋은 블로그 게시물은 "가변 길이 배열의 합법적 사용" (Chris Wellons, 2019-10-27)입니다.