Правильные аргументы как константы или операнды - PullRequest
0 голосов
/ 24 февраля 2012

Считаете ли вы, что важно строго использовать const каждый раз, когда значение не будет изменено, или передавать аргументы в качестве указателей, только когда данные будут изменены?

Я бы хотел что-то сделатьверно, но если struct, переданный в качестве аргумента, имеет большой размер, разве вы не хотите передавать адрес вместо копирования данных?Обычно кажется, что простое объявление аргумента struct в качестве операнда является наиболее функциональным.

//line1 and line2 unchanged in intersect function
v3f intersect( const line_struct line1, const line_struct line2); 
//"right" method?  Would prefer this:
v3f intersect2( line_struct &line1, line_struct &line2); 

Ответы [ 2 ]

1 голос
/ 24 февраля 2012
v3f intersect( const line_struct line1, const line_struct line2);

в точности эквивалентно

v3f intersect(line_struct line1, line_struct line2);

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

Эти формы отличаются от

v3f intersect(const line_struct *line1, const line_struct *line2);

, который не должен копировать строки, потому что он пропускает только указатели. Это предпочтительная форма в C, особенно для больших структур. Также требуется для непрозрачных типов .

v3f intersect2(line_struct &line1, line_struct &line2);

недействительно C.

0 голосов
/ 24 февраля 2012

C не имеет ссылки (&).

В C используйте указатель на структуру const в качестве типа параметра:

v3f intersect(const line_struct *line1, const line_struct *line2);

Таким образом, будет скопирован только указательв вызове функции, а не всей структуры.

...