함수 내부의 정적 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
암시입니다 const
만 const
과 static
거의 직교 (과의 상호 작용을 제외하고 static const
정수.)
C++
객체 모델 (§1.9)의 모든 비트 필드는 메모리의 적어도 하나의 바이트를 차지하고 주소가 아닌 다른 오브젝트해야; 또한 주어진 순간에 프로그램에서 관찰 할 수있는 그러한 모든 객체는 별개의 주소를 가져야한다 (문단 6). 컴파일러는 로컬 비 정적 const 배열로 함수를 호출 할 때마다 스택에 새 배열을 만들 필요가 없습니다. 컴파일러는 as-if
원칙적으로 피난처를 취할 수 있기 때문에 다른 객체가 없다는 것을 증명할 수 있기 때문입니다 관찰했다.
정의가 다소간에 배열이 주소이기 때문에 함수가 사소하지 않으면 (예를 들어, 번역 단위 내에서 본문이 보이지 않는 다른 함수를 호출하지 않는 한) 안타깝게도 쉽게 증명할 수 없습니다. 따라서 대부분의 경우 정적이 아닌 const(expr)
배열은 호출 할 때마다 스택에서 다시 작성해야하므로 컴파일시 배열을 계산할 수있는 지점을 잃게됩니다.
반면, 로컬 static const
객체는 모든 옵저버가 공유하며, 정의 된 함수가 호출되지 않더라도 초기화 될 수 있습니다. 따라서 위의 어느 것도 적용되지 않으며 컴파일러는 단일 인스턴스 만 생성 할뿐 아니라 자유 롭습니다. 읽기 전용 스토리지에서 인스턴스 하나를 자유롭게 생성 할 수 있습니다.
따라서 static constexpr
귀하의 예에서 분명히 사용해야 합니다.
그러나을 사용하고 싶지 않은 경우가 있습니다 static constexpr
. 않는 constexpr
선언 된 개체 중 하나입니다 ODR-사용 또는 선언이 static
컴파일러는 전혀 포함시키지 무료입니다. constexpr
불필요한 바이트로 컴파일 된 프로그램을 오염시키지 않고 컴파일 타임 임시 배열을 사용할 수 있기 때문에 매우 유용 합니다. 이 경우 런타임에 객체가 존재하게 될 가능성이 static
있으므로 를 사용하고 싶지 않습니다 static
.
'Programing' 카테고리의 다른 글
.idea 폴더 란 무엇입니까? (0) | 2020.05.27 |
---|---|
너비와 높이가 고정 된 줄임표가 추가 된 크로스 브라우저 멀티 라인 텍스트 오버 플로우` (0) | 2020.05.27 |
json.Unmarshal과 json.NewDecoder.Decode를 사용하여 JSON 디코딩 (0) | 2020.05.27 |
“this”모듈의 소스 코드는 무엇입니까? (0) | 2020.05.27 |
URL 매트릭스 매개 변수와 요청 매개 변수 (0) | 2020.05.27 |