2016-07-09 2 views
2

우리는 코드 일부를 C++ 03에서 C++ 14로 마이그레이션하고 있으며 성능상의 이점이있는 곳이라면 C++ 14 기능을 사용하고자합니다. 이제 우리 프로젝트 중 하나에서 열 이름과이 열 이름을 기반으로 구문 분석 CSV는 다음과 같이 하나 개의 헤더 파일에 선언되어있다 :constexpr 문자열과 const 문자열

const string ITEM_NAME = "Item Name"; 
const string ITEM_ID = "Item Id"; 

내가 위의 변경하면 내가 알고 싶은 어떤 의미의 performace 이득이 있는가 이런 상수의 수백이있다 코드는 다음과 같습니다.

constexpr string ITEM_NAME = "Item Name"; 
constexpr string ITEM_ID = "Item Id"; 

읽기 전용 메모리에 저장해야하기 때문에 바이너리에서 가질 수있는 constexpr?

컴파일러가 자동으로 오래된 C++ 03 코드를 최적화하고 const 변수를 읽기 전용 메모리에도 넣을 수 있습니까?이 노력은 가치가 없습니다.

+1

주제 끄기 : 당신의 팀이'사용하여 std 네임 스페이스와 글로벌 네임 스페이스를 오염되는 것 같습니다;'헤더 또는 일부 매우 넓은 범위에서. 위험하고 어떤 장소에서 많은 어려움을 겪을 것입니다. – user4581301

+1

아니요. 네임 스페이스 안에 이러한 모든 상수가 있습니다. csvconst – Kapil

+0

하! "may be"대신에 "is"를 사용하도록 가르쳐주십시오. 게시하기 전에 잘못된 말에 고생하는 데 너무 많은 시간을 보냈습니다. 나는 서있다. – user4581301

답변

7

constexpr 표현식을 평가할 수없는 특정 컨텍스트에서 표현식을 평가할 수 있다는 점을 제외하면 constexpr을 사용하는 이점은 없습니다.

이 작동하고 const이 작동하지 않는 구체적인 이유가없는 한 const을 사용해야합니다.

변수가 실제로 읽기 전용 메모리에 필요한 경우 const이나 constexpr도 모두 다릅니다. 나는 단지 사소한 타입이 읽기 전용 메모리에 안정적으로 배치 될 것이라고 기대할 것이고 std::string은 확실히 사소한 타입이 아닙니다. ("사소한 유형은"기술적 인 용어입니다.)

+0

constexex가 아닌 표현식을 평가할 수없는 예제를 제공 할 수 있습니까? – Kapil

+2

템플릿 전문화 및 배열 크기 조정과 같은 @Kapil 컴파일 타임 작업. C++ 03에서'const'를 사용하여 컴파일 할 수있는 것은 아무것도 없었으므로 변경하지 않고 잘 수행해야합니다. – user4581301

2

아니요, 성능 향상이있을 것으로 기대하지 않습니다.

C++ 언어는 constexpr 개체/메소드의 수에 최대 한도를 지정하지 않습니다. 모든 제한은 컴파일러 및/또는 운영 체제에서 부과됩니다.

C++ 언어는 컴파일러에서 const 변수를 "읽기 전용 메모리"라고 지정하는지 여부를 지정하지 않습니다. 최신 운영 체제는 가상 메모리 및 주소 공간을 정교하게 구현하고 응용 프로그램이 읽기/쓰기 및 읽기/전용과 같은 다양한 속성을 사용하여 가상 주소 공간의 서로 다른 영역을 지정하고 최신 C++ 컴파일러가 최대한의 이점을 발휘할 수 있도록합니다 최적의 가상 메모리 성능을 얻기 위해 별도의 메모리 세그먼트에 읽기 전용으로 지정된 개체를 배치합니다.

관련 문제