2016-12-17 2 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-std :: auto_ptr, std :: unique_ptr, 1 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++ 17 –

+0

Что я могу использовать вместо std :: auto_ptr? Потому что я слышал, что он устарел. – Hball

3

В целом это очень плохо идея - по двум причинам:

Вторичный причина: Вы используете ручную выделение кучи без упаковки его в смарт-указатель. Но добавление, например, std::unique_ptr просто помещал бы бандаж на симптомы.

Основная причина: вы думаете в правильном направлении (избегайте ненужных копий больших сумм данных), но вы используете неправильный инструмент. Тип параметра функции - это правильный инструмент.

Нужно ли только функции читать строку? Затем его подпись должна быть:

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

Передача const ref не будет копировать строку. Если вам нужно написать-доступ, а также, оставить из const:

return_type anyfunction(std::string& test); 

Опять же, ни одна копия не делается. Перемещение строки в функцию также может быть опцией. Но трудно сказать без дальнейшего контекста.

1

std :: string в основном создается на куче. Некоторая оптимизирующая версия создаст короткие строки в стеке для скорости, но это не проблема.

Создание с использованием новых не рекомендуется, поскольку объект не может автоматически уничтожаться по мере его выхода из области видимости. (Иногда вам нужно это поведение, но это редко, действительно, вы должны считать новое устаревшим для начинающих программистов на C++). И это не будет существенно влиять на использование вашего стека, поскольку в стек попадают только несколько тривиальных переменных управления.

Вы не показали, как вы его инициализируете. Или как вы собираетесь использовать данные. При передаче const std :: string & действительно просто альтернативная нотация для передачи указателя, это более идиоматично. Однако современный C++ переходит к строковым представлениям. По существу вы создаете строку, затем создаете представления на данные. Если строка очень длинная, это может быть важно. Например, для поиска коротких подстрок на длинной строке очень много времени, если ваша длинная строка - это массив жира, довольно быстрый, если это дерево суффикса.

просмотров Струнные все еще экспериментальный: http://en.cppreference.com/w/cpp/experimental/basic_string_view

1

Использование указателей означает еще один уровень косвенности.C++ 11 имеет семантику перемещения, поэтому можно легко перемещать копию строки без глубокой копии, которая в основном устраняет необходимость в new строке или любом другом объекте C++.