2013-03-26 2 views
4

안녕하세요 저는 대중이 클라이언트가 제공하는 버퍼에서 작업 할 수있는 기능을 가진 문자열 클래스 (예 : std::string)를 사용하고 싶다고 생각했습니다.포인터 인수로 char * 및 char const *를 장식하십시오. 좋은 방법입니까?

당신이 생각하는 위험은 무엇입니까? 고전적인 냄새인가요? etcaetera

그래서 같은 의미 : acquire_RWacquire_ROext 여부를 문자의 수정을 허용 할 :

char ext[64] = {0}; 
my::string s(ext, my::string::acquire_RW); 
size_t len = s.size(); 
size_t pos = s.find("zboub"); 
my::string s2(s); // uses true (alloc+)copy semantic here. 

그래서 나는이 개 전략을 forsee. 그리고 임의의 비 const 메소드의 경우는 RO이고, 버퍼가 확장되어야하는 메소드의 경우는 RW입니다. 이 순간에만 & 복사본을 할당합니다.

그런데 my::string 유형은 char* 유형의 데코레이터가됩니다.

물론 클라이언트에게 데코레이터가 요구 사항으로 남겨지기 전에 외부 버퍼를 비우지 않도록주의하십시오. 귀하의 우려

+1

나는 항상 STL 문제 중 하나가 메모리를 처리하지 않고 const char * 및 size를받는 문자열을 제공하지 않는다는 것을 발견했으며 – Alon

답변

1

'우수 사례'에 대한 대답은 어렵습니다. 일반적으로 좋은 연습은 아니지만 특정 사용 사례는 아주 좋은 습관이라고 할 수 있습니다. 그것은 모두 제공되는 메모리의 수명 동안 클라이언트를 얼마나 신뢰할 수 있는지에 달려 있습니다. 일반적으로 신뢰가 없습니다. 특별한 경우 : OK.

현명한 성능을 고려하는 일보다는 중요한 일이있다 :

당신이 당신의 문자열의 당신의 할당 변형 (쓰기 및 참조 횟수에 사본) 암시 적 공유를 사용할 계획이 있습니까? 또는 가치 의미론을 사용할 계획입니까 (항상 복사, 절대 참조하지 않습니까)?

다중 프로세서 및 다중 스레드 환경에서 값 의미는 문자열에 대해 선호되는 방법입니다. 암시 적 공유를 사용하여 성능을 향상 시키려면 다중 스레드 환경에서 필요한 잠금을 사용하십시오.

멀티 스레드 일 때도 제안이 유효 할 수 있음에 유의하십시오. 외부 메모리에서 할당 된 변형 (잠금 필요 없음)으로 넘어갈 때 copy-on-write를 완벽하게 사용할 수 있으며 이후의 값 의미도 가능합니다 잠금 필요). 이것은 최고 일 것입니다.

예를 들어 문자열을 많이 사용하는 파일을 메모리 맵핑하고 이러한 작은 문자열과 조각 메모리의 복사본을 저장하지 않으려는 매우 구체적인 사용 사례에서 변형이 잘 작동한다고 생각합니다.

그러나 일반적인 경우에는 걱정하지 않으므로 std::string을 사용하십시오.

+0

좋은 답변 :) 그렇습니다. 가치 의미론을 세웠지 만 RO 정책으로 만 맞습니다. 분명히 2 명의 클라이언트가 RW의 동일한 버퍼를 참조하면 협력하지 않으면 문제가 발생합니다. 멀티 쓰레드 관심사는 내가 토론을 시작하기를 기다리고 있었다. 그것을 언급하는 +1. –

0

나는 그것이 좋은 아이디어라고 생각하지만, 내가 읽기 전용 스틱 것을 공유하기위한

감사합니다; std::string은 물론 RW에 적합합니다. 물론 메모리 할당을 줄일 수있는 상황이 아니라면 말입니다.

정적 문자열로 인해 문제가 발생하는 경우를 제외하고는 상당히 최적화 된 방법이므로 노력할 필요가 없습니다.

+0

실제로 RW는 더 까다로워 보입니다. 기존의 구현 (항상 내부적으로 관리되는 버퍼에 의존하는)은 이미 느슨한 문자열 크기 대 버퍼 크기 관계를 지원했기 때문에 용량을 초과하지 않는 모든 쓰기를 허용하는 것이 다소 쉽다고 생각했습니다. (RO에서 0으로, RW에서 strlen으로 용량을 설정했기 때문에) –

관련 문제