Обработка ошибок ядра ASP.NET с помощью RouteDataRequestCultureProvider

Ну, главный вопрос: зачем мне использовать указатель, а не сам объект? И мой ответ: вы должны (почти) никогда не использовать указатель вместо объекта, потому что C ++ имеет ссылки , он более безопасен, чем указатели и гарантирует ту же производительность, что и указатели.

Другое дело вы упомянули в своем вопросе:

Object *myObject = new Object;

Как это работает? Он создает указатель на тип Object, выделяет память для размещения одного объекта и вызывает конструктор по умолчанию, звучит хорошо, правильно? Но на самом деле это не так хорошо, если вы динамически выделяете память (используется ключевое слово new), вам также нужно освобождать память вручную, это означает, что код должен иметь:

delete myObject;

Это вызывает деструктор и освобождает память, выглядит легко, однако в больших проектах может быть трудно обнаружить, если один поток освободил память или нет, но с этой целью вы можете попробовать общие указатели , это немного снижает производительность, но это гораздо легче работать с ними.


И теперь некоторое введение завершено и возвращается к вопросу.

Вы можете использовать указатели вместо объектов для повышения производительности при передаче данных между функцией.

Взгляните, у вас есть std::string (это тоже объект), и он содержит очень много данных, например большой XML, теперь вам нужно его разобрать, но для этого у вас есть функция void foo(...), которые могут быть объявлены по-разному:

  1. void foo(std::string xml); В этом случае вы скопируете все данные из вашей переменной в стек функций, потребуется некоторое время, поэтому ваш результат e будет низким.
  2. void foo(std::string* xml); В этом случае вы передадите указатель на объект с той же скоростью, что и передающая переменная size_t, однако это объявление имеет склонность к ошибкам, поскольку вы можете передать указатель NULL или неверный указатель. Указатели обычно используются в C, потому что у него нет ссылок.
  3. void foo(std::string& xml); Здесь вы передаете ссылку, в основном это то же самое, что и передающий указатель, но компилятор делает некоторые вещи, и вы не можете передать недопустимую ссылку (на самом деле можно создать ситуацию с недопустимой ссылкой, но это компилятор tricking).
  4. void foo(const std::string* xml);. То же самое, что и во втором, просто значение указателя не может быть изменено.
  5. void foo(const std::string& xml); Здесь то же самое, что и третье, но значение объекта не может быть изменено.

Что еще я хочу упомянуть, вы можете использовать эти 5 способов передачи данных независимо от того, какой путь распределения вы используете выбрали (с new или regular ).


Другое дело, когда вы создаете объект в правильном способе, вы выделяете память в стеке, но пока вы создаете его с new, вы выделяете кучу. Гораздо быстрее выделять стек, но он очень мал для действительно больших массивов данных, поэтому, если вам нужен большой объект, вы должны использовать кучу, потому что вы можете получить переполнение стека, но обычно эта проблема решается с помощью STL контейнеры и помнить, что std::string также является контейнером, некоторые ребята забыли его:)

0
задан user197508 13 July 2018 в 08:35
поделиться