programing

동적 할당 없이 실행 시 어레이 크기가 허용됩니까?

itsource 2022. 7. 5. 23:26
반응형

동적 할당 없이 실행 시 어레이 크기가 허용됩니까?

저는 몇 년 동안 C++를 사용해 왔는데, 오늘 몇 가지 코드를 보았습니다만, 어떻게 이것이 완전히 합법적일 수 있을까요?

int main(int argc, char **argv)
{
    size_t size;
    cin >> size;
    int array[size];
    for(size_t i = 0; i < size; i++)
    {
        array[i] = i;
        cout << i << endl;
    }

    return 0;
}

GCC에서 컴파일.

크기를 런타임에 결정하려면 어떻게 해야 합니까?new또는malloc?

다시 한 번 확인해보려고 검색해 보니 제 코드와 유사한 코드가 모두 스토리지 크기 오류를 나타내고 있습니다.

심지어 Deitel의 C++ How To Programming(C++ 프로그래밍 방법) 페이지 261에서 공통 프로그래밍 오류 4.5:

자동 배열과 정적 배열의 크기를 선언하는 데 사용할 수 있는 것은 상수뿐입니다.

나를 깨우쳐줘.

이것은 C99에서 유효합니다.

C99 규격은 스택 상에서 가변 크기 어레이를 지원합니다.컴파일러도 이 구성을 지원하기로 선택했을 것입니다.

이것은 다른 점에 주의해 주세요.malloc그리고.new.gcc스택에 어레이를 할당합니다.int array[100]스택 포인터를 조정하기만 하면 됩니다.힙 할당은 이루어지지 않습니다.거의 비슷합니다.

이를 VLA(가변장 어레이)라고 합니다.c99 에서는 표준이지만, gcc 에서는 확장으로서 c++ 코드로 사용할 수 있습니다.코드를 거부하려면 다음 명령을 사용해 보십시오.-std=standard,-ansi그리고.-pedantic옵션들.

이 코드는 GNU GCC 컴파일러에서 실행됩니다.

#include<bits/stdc++.h>

int main(int argc, char **argv)

{
    size_t size;

   std:: cin >> size;

    int array[size];

    for(size_t i = 0; i < size; i++)

{

array[i] = i;

        std:: cout << i;

 }

    return 0;
}

가변길이 어레이(VLA)는 최근 인정되어 공개 대기 중인 C++14 규격으로 지원됩니다.

C99에서만 유효합니다.다음 번에는 신뢰할 수 있는 컴파일러에서 코드를 확인해 보십시오.

유효한 C99, 유효한 C++가 아닙니다.이것은 두 언어 사이의 적지 않은 차이 중 하나이다.

Dev-Cpp 컴파일러를 사용하는 경우 어레이의 크기를 동적으로 지정할 수 있습니다.해 봤지만 에러는 발생하지 않았습니다만, 비주얼 c++ 컴파일러와 비주얼 스튜디오 컴파일러에서는 사용할 수 없습니다.그 이유는 dev-c++가 초기화되지 않은 int에 양수를 할당하고 번호를 지정하면 지정된 int로 대체되지만 다른 컴파일러는 초기화되지 않은 변수에 null을 부여합니다.

최근에 스택 할당 어레이가 필요한 시나리오를 접했습니다.(모든 메서드 호출에 arg 배열이 필요했던 v8에 대한 래퍼입니다).

std::벡터는 히프메모리 할당을 실시하지만 퍼포먼스가 적절하지 않습니다.

다음은 제 솔루션입니다.템플릿을 사용하여 케이스 어레이를 할당합니다.

template<size_t Argc>
static void call(...) {
    v8::Local<v8::Value> v8Args[Argc];

    // use v8Args
    ...
}

template<typename It>
static void callV8Function(size_t argc, It argvBegin, It argvEnd,) {
    // C++ don't have dynamic stack allocation (like C99 does)
    // try to avoid heap-allocation...
    if (argc <= 4) {
        return callV8FunctionOnStack<4>(...);
    } else if (argc <= 8) {
        return callV8FunctionOnStack<8>(...);
    } else if (argc <= 16) {
        return callV8FunctionOnStack<16>(...);
    } else if (argc <= 32) {
        return callV8FunctionOnStack< 32>(...);
    } else {
        std::vector<v8::Local<v8::Value>> v8Args(argc);
        // fallback to vector
   }
}

(물론 32사이즈 어레이로도 충분하지만, 그다지 우아하지는 않습니다.)

언급URL : https://stackoverflow.com/questions/737240/array-size-at-run-time-without-dynamic-allocation-is-allowed

반응형