Плохо ли тасовать данные вместо указателей на них? - PullRequest
0 голосов
/ 22 ноября 2011

На самом деле это не вопрос домашней работы, а вопрос, который постоянно мучает меня, когда я делаю домашнюю работу.В моей книге иногда дается упражнение по перестановке данных, и в явном виде будет сказано сделать это, изменяя только указатели, а не перемещая данные (например, в связанном списке с использованием структуры «узел» с полем данных и следующимполе указателя, измените только следующее поле).

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

Спасибо за любые мысли.:)

Ответы [ 6 ]

4 голосов
/ 22 ноября 2011

Вот 3 причины:

Универсальность / ремонтопригодность :

Если вы можете заставить свой алгоритм работать, изменяя только указатели, то он всегда будет работать независимо от того, какие данные вы поместили в свой "узел".

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

Эффективность

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

Безопасность

И, кроме того, маршрут манипуляции с указателями не вызовет путаницы с другим кодом, который имеет собственные указатели на ваши данные, как указывает @caf.

1 голос
/ 22 ноября 2011

Перестановка указателей или индексов выполняется, когда копирование или перемещение реальных объектов затруднено или неэффективно.Нет ничего плохого в том, чтобы перетасовывать сами объекты, если это более удобно.

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

1 голос
/ 22 ноября 2011

Это зависит.Как правило, имеет смысл перемещать меньшую вещь, поэтому, если перетасовываемые данные больше, чем указатель (что обычно имеет место), тогда более разумно перетасовывать указатели, а не данные.

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

0 голосов
/ 22 ноября 2011

Это зависит от данных.Если вы просто перемещаетесь вокруг int s или char s, перетасовать данные будет не дороже, чем указатель.Однако, как только вы пройдете определенный размер или сложность, вы начнете быстро терять эффективность.Перемещение объектов по указателю будет работать для любых содержащихся в них данных, поэтому привыкание к использованию указателей даже на игрушечных структурах, которые используются в ваших заданиях, поможет вам обрабатывать эти большие, сложные объекты без.

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

0 голосов
/ 22 ноября 2011

Если у вас есть указатели, я предполагаю, что они существуют в динамической памяти ... Другими словами, они просто существуют ... Так зачем беспокоиться об изменении данных из одного в другой, перераспределении при необходимости?

Обычно целью списка является получение значений из любого места, с точки зрения памяти, в непрерывный список.

При такой структуре вы можете переупорядочивать и переупорядочивать список без необходимостипереместите данные.

Вы должны понимать, что перемещение данных подразумевает чтение и запись в память (не говоря о перераспределении).

Это потребляет ресурсы ... Так что переупорядочение толькоадреса намного эффективнее!

0 голосов
/ 22 ноября 2011

Перемещение данных занимает больше времени, и в зависимости от характера ваших данных оно также может не любить перемещения (например, структура, содержащая указатели внутри себя по каким-либо причинам).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...