2016-12-17 1 views
2

현대 C++ 문자열에 포인터를 사용하는 것이 좋습니다? 이처럼 다음 시험 변수에C++ 현대 문자열 포인터

std::string *test = new string(); 
anyfunction(test); 

은 매우 긴 텍스트입니다. 그래서 나는 포인터로 행동하는 것이 더 쉽고 빠르다 고 생각했습니다.

이것은 좋은 코드입니까 아니면 나쁜 코드입니까?

+6

C++는 참조를 선호합니다. 예를 들어'std :: string test; void anyfunction (const std :: string & s); anyfunction (test)'. – UmNyobe

+6

*** 현대적인 C++ 문자열에 포인터를 사용하는 것이 좋습니다? *** 그렇게하지 마십시오. 'C++ '코드를 작성했지만 한 번도하지 않았습니다. – drescherjm

답변

-1

현대 C++에서는 원시 포인터를 사용하지 않는 것이 좋습니다. 대신 스마트 포인터를 사용할 수 있습니다. C++ 11- :: auto_ptr, std :: unique_ptr, std :: shared_ptr 및 std :: weak_ptr의 네 가지 스마트 포인터가 있습니다. 모두는 동적으로 할당 된 객체의 수명을 관리하는 데 도움이되도록 설계되었습니다. 즉, 해당 객체가 적절한 시간에 적절하게 파괴되도록 보장함으로써 리소스 누출을 방지합니다 (예외 발생시 포함).

차 이유 : 당신은 수동 힙 할당을 사용하는 스마트 포인터를 포장하지 않고 두 가지 이유 -이 일반적으로

+1

auto_ptr이 사용되지 않습니다.이 경우 가장 좋은 조언은 포인터를 사용하지 않는 것입니다 .. –

+0

[std :: auto_ptr] (http : /en.cppreference.com/w/cpp/memory/auto_ptr)은 C++ 11 이후로 더 이상 사용되지 않으며 C++에서는 제공되지 않습니다. –

+0

std :: auto_ptr 대신 사용할 수있는 것은 무엇입니까? 사용하지 않으려했기 때문에 – Hball

3

정말 나쁜 생각입니다. 하지만 예를 들어 std::unique_ptr는 증상에 반창고를 붙이기 만합니다.

주된 이유 : 올바른 방향으로 생각하고 있지만 (큰 불필요한 데이터 청크를 피하십시오) 잘못된 도구를 사용하고 있습니다. 함수 매개 변수의 유형이 올바른 도구입니다.

이 함수는 문자열? 그 다음 서명은 다음과 같아야합니다.

return_type anyfunction(const std::string& test); 

const를 통한 전달은 문자열을 복사하지 않습니다. 당신이 쓰기 액세스뿐만 아니라 필요한 경우 const을 떠나 :

return_type anyfunction(std::string& test); 

다시 한번 더 복사가 이루어지지 않습니다. 문자열을 함수로 이동하는 것도 옵션 일 수 있습니다. 그러나 더 이상의 맥락 없이는 말하기가 어렵습니다.

1

std :: string은 기본적으로 힙에 만들어집니다. 일부 최적화 버전은 속도에 대해 스택에 짧은 문자열을 생성하지만 여기에는 문제가 없습니다.

범위를 벗어나면 개체를 자동 파괴 할 수 없으므로 new를 사용하여 만들기를 권장하지 않습니다. (때로는이 동작을 원하지만, 드문 경우지만 C + + 프로그래머가 처음으로 쓸모 없다고 생각해야합니다.) 그리고 몇 가지 사소한 제어 변수 만 스택에 저장되기 때문에 스택 사용에 큰 영향을 미치지 않습니다.

초기화 방법을 표시하지 않았습니다. 또는 데이터 사용 방법. const std :: string을 전달하는 동안 &은 실제로 포인터를 전달하기위한 대체 표기법이지만, 더 관용적입니다. 그러나 현대 C++은 문자열보기로 이동하고 있습니다. 기본적으로 문자열을 만든 다음 데이터에 대한보기를 만듭니다. 문자열이 매우 길면 중요 할 수 있습니다. 예를 들어, 긴 문자열에 짧은 부분 문자열 검색을 수행하려면 긴 문자열이 굵은 배열 인 경우 매우 시간이 많이 걸리고 접미사 트리이면 꽤 빠릅니다.

문자열 전망은 여전히 ​​실험 단계 : http://en.cppreference.com/w/cpp/experimental/basic_string_view

1

포인터를 사용하여 간접의 다른 수준을 의미한다.C++ 11은 이동 의미론을 가지고 있기 때문에 깊은 복사없이 문자열의 복사본을 쉽게 옮길 수 있습니다. 대부분 new 문자열이나 다른 C++ 객체가 필요 없습니다.