2009-08-06 4 views
1

다소 간단한 질문입니다. 어디에서 오류, 예외, 사용자 메시지를 저장해야합니까? 지금까지 필자는 항상 로컬 문자열을 호출 할 함수 내에서 로컬 문자열을 선언했으며 걱정하지 않았습니다. 예 : 사용자, 오류, 예외 메시지 저장 (C++)

SomeClass::function1(...) 
{ 
std::string str1("message1"); 
std::string str2("message2"); 
std::string str3("message3"); 
... 
// some code 
... 
} 

은 갑자기 건설 & 초기화 이후마다 호출하고 꽤 비쌀 수 있음을 깨달았다. 클래스 나 심지어 별도의 모듈에 정적 문자열로 저장하는 것이 더 좋을까요? 현지화가 여기에 해당하지 않습니다.

미리 감사드립니다.

답변

5

필요할 때 문자열 상수를 사용하지 않는 이유는 무엇입니까?

SomeClass::function1(...) 
{ 
/* ... */ 
    throw std::runtime_error("The foo blortched the baz!"); 
/* ... */ 
} 

또는 static const std::string을 사용할 수 있습니다. 다른 std::string의 많은에 복사 할 것으로 예상 경우에 적합하고 C++ 구현 기록 중 복사 않습니다

SomeClass::function1(...) 
{ 
    static const std::string str_quux("quux"); // initialized once, at program start 
    xyz.someMember = str_quux; // might not require an allocation+copy 
} 

당신이이 string의 복사본을 많이 할 것으로 예상되는 경우, 그리고 에 copy-on-write를 쓰지 않았거나 존재하지 않을 수 있다면 boost::flyweight을 사용하는 것이 좋습니다.

+0

대부분의 현재 구현은 copy-on-write를 수행하지 않습니다. 이들이 제공하는 이점 (성능 측면에서)은 스레드 안전성을 얻으려면 문제의 양을 능가합니다. 다중 쓰레드 환경을 다루기 위해서는 잠금을 추가하여 모든 작업 (읽기와 쓰기 모두)을 보호해야합니다. 그러면 성능이 크게 떨어집니다. –

+0

경고 : 함수의 로컬 통계 (예 : str_quux)는 프로그램 시작시에는 포함되지 않지만 함수를 처음 실행하면 초기화됩니다. 이로 인해 스레드 안전 문제가 발생합니다. –

1

TBH 아마도 필요할 때만 오류 메시지를 구성하는 것이 가장 좋습니다 (예 : 속도가 느려지는 사람이 잘못 처리되는 경우). 메시지가 항상 나타나면 매번 초기화 될 것이라는 사실을 피하기 위해 메시지를 정적으로 정의하는 것이 가장 좋습니다. 하지만 일반적으로 사용자 메시지를 디버그 모드로 표시하기 때문에 성능 빌드를 수행하려는 사용자에게 표시하기가 쉽지 않습니다. 그런 다음 필요할 때만 구성합니다.

+0

+1 함수의 맨 위에있는 변수 정의는 C++에서 (바로 올바로, IMO) 눈살을 찌푸리게합니다. 필요할 때 정의하십시오. 메시지를 조작하지 않으려는 경우 문자열을 만드는 이유는 무엇입니까? – sbi