Programing

함수 내부의 정적 constexpr 변수가 의미가 있습니까?

lottogame 2020. 5. 27. 07:32
반응형

함수 내부의 정적 constexpr 변수가 의미가 있습니까?


내가 함수 내에서 (예를 들어, 큰 배열을) 변수가 있다면, 그것은 두 선언은 의미가 수행 static하고에게 constexpr? constexpr컴파일 타임에 배열이 생성되도록 보장하므로 static쓸모가 없습니까?

void f() {
    static constexpr int x [] = {
        // a few thousand elements
    };
    // do something with the array
}

는 IS static생성 된 코드 또는 의미의 측면에서이 실제로 일을 아무것도?


짧은 대답은 static유용 할뿐만 아니라 항상 원할 것입니다.

첫째, 그 노트 static와는 constexpr서로 완전히 독립적입니다. static실행 중 객체의 수명을 정의합니다. constexpr컴파일 중에 오브젝트를 사용할 수 있도록 지정합니다. 컴파일과 실행은 시간과 공간 모두에서 분리되고 불 연속적입니다. 따라서 프로그램이 컴파일되면 constexpr더 이상 관련이 없습니다.

선언 된 모든 변수는 constexpr암시입니다 constconststatic거의 직교 (과의 상호 작용을 제외하고 static const정수.)

C++객체 모델 (§1.9)의 모든 비트 필드는 메모리의 적어도 하나의 바이트를 차지하고 주소가 아닌 다른 오브젝트해야; 또한 주어진 순간에 프로그램에서 관찰 할 수있는 그러한 모든 객체는 별개의 주소를 가져야한다 (문단 6). 컴파일러는 로컬 비 정적 const 배열로 함수를 호출 할 때마다 스택에 새 배열을 만들 필요가 없습니다. 컴파일러는 as-if원칙적으로 피난처를 취할 수 있기 때문에 다른 객체가 없다는 것을 증명할 수 있기 때문입니다 관찰했다.

정의가 다소간에 배열이 주소이기 때문에 함수가 사소하지 않으면 (예를 들어, 번역 단위 내에서 본문이 보이지 않는 다른 함수를 호출하지 않는 한) 안타깝게도 쉽게 증명할 수 없습니다. 따라서 대부분의 경우 정적이 아닌 const(expr)배열은 호출 할 때마다 스택에서 다시 작성해야하므로 컴파일시 배열을 계산할 수있는 지점을 잃게됩니다.

반면, 로컬 static const객체는 모든 옵저버가 공유하며, 정의 된 함수가 호출되지 않더라도 초기화 될 수 있습니다. 따라서 위의 어느 것도 적용되지 않으며 컴파일러는 단일 인스턴스 만 생성 할뿐 아니라 자유 롭습니다. 읽기 전용 스토리지에서 인스턴스 하나를 자유롭게 생성 할 수 있습니다.

따라서 static constexpr귀하의 예에서 분명히 사용해야 합니다.

그러나을 사용하고 싶지 않은 경우가 있습니다 static constexpr. 않는 constexpr선언 된 개체 중 하나입니다 ODR-사용 또는 선언이 static컴파일러는 전혀 포함시키지 무료입니다. constexpr불필요한 바이트로 컴파일 된 프로그램을 오염시키지 않고 컴파일 타임 임시 배열을 사용할 수 있기 때문에 매우 유용 합니다. 이 경우 런타임에 객체가 존재하게 될 가능성이 static있으므로 를 사용하고 싶지 않습니다 static.

참고 URL : https://stackoverflow.com/questions/13865842/does-static-constexpr-variable-inside-a-function-make-sense

반응형