Последствия только использования стека в C ++ - PullRequest
16 голосов
/ 12 сентября 2010

Допустим, я знаю парня, который плохо знаком с C ++.Он не передает указатели (правильно), но он отказывается передавать по ссылке.Он всегда использует проход по значению.Причина в том, что он чувствует, что «передача объектов по ссылке является признаком неправильного дизайна».

Программа представляет собой небольшую графическую программу, и большая часть рассматриваемой передачи - это математические объекты Vector (3 кортежа).Есть несколько больших объектов контроллера, но нет ничего более сложного, чем это.

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

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

Что касается профессионалов, я считаю, что стек быстрее выделяет / освобождает память и имеет постоянное время выделения.1010 * Единственный важный аргумент, который я могу придумать, заключается в том, что стек может переполниться, но я предполагаю, что это вряд ли произойдет?Есть ли другие аргументы против использования только стека / передачи по значению, а не передачи по ссылке?

Ответы [ 13 ]

2 голосов
/ 12 сентября 2010

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

Упомянутый «недостаток» передачи по значению просто не соответствует действительности. Передача всего по значению полностью изменит производительность приложения. Это не так плохо, когда примитивные типы (например, int, double и т. Д.) Передаются по значению, но когда экземпляр класса передается по значению, создаются временные объекты, для которых требуются конструкторы, а затем и деструкторы, вызываемые для класса и для всех переменной-члена в классе. Это раздражает, когда используются большие иерархии классов, потому что должны также вызываться конструкторы / деструкторы родительских классов.

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

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

1 голос
/ 12 сентября 2010

Ух ты, уже есть 13 ответов ... Я не читал все подробно, но думаю, что это сильно отличается от других ...

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

Просто объясните ему разницу между vector3 & и vector3 const& и продемонстрируйте, какпоследний может быть инициализирован константой, как в vec_function( vector3(1,2,3) );, но не первым.Передача по константной ссылке - это простая оптимизация передачи по значению.

0 голосов
/ 12 сентября 2010

Купи своему другу хорошую книгу на С ++. Передача нетривиальных объектов по ссылке является хорошей практикой и избавляет вас от ненужных вызовов конструктора / деструктора. Это также не имеет ничего общего с размещением в бесплатном хранилище по сравнению с использованием стека. Вы можете (или должны) передавать объекты, размещенные в стеке программ, по ссылке без какого-либо бесплатного использования магазина. Вы также можете полностью игнорировать бесплатное хранилище, но это возвращает вас к тем старым временам, которые ваш друг, вероятно, не имел в виду - иначе он выбрал бы древний компилятор f77 для вашего проекта, не так ли? *

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