2015-07-26 3 views
2

Я сталкиваюсь с этим output param convention, что способствует указателям, а не рекомендациям.Избегайте бесконтактных эталонных параметров

«В списках параметров функции все ссылки должны быть константной:.

void Foo(const string &in, string *out);

На самом деле это очень сильная условность в коде Google, что входные аргументы являются значениями или константные ссылки, а выходные аргументы являются указателями ввода параметры могут быть константными указателями, , но мы никогда не позволяют неконстантным эталонные параметры, за исключением, когда это требуется в соответствии с соглашением, например, своп(). "

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

Так что интересно, действительно ли этот input param is const reference, output param is pointer является только вопросом стиля Google, или это более общепринятая практика (чтобы избежать неконстантных опорных параметров).

+2

Вы можете рассмотреть возможность того, что упомянутый стандарт кодирования не является допустимым это так, лучший в мире ... – PiotrNycz

+0

Это общепринятая практика, так как использует ссылки для выходных параметров. Использование ссылок, по-видимому, более популярно, что, по-моему, во многом связано с тем, что это делает стандартная библиотека C++ (т. Е. 'Swap()'). Но только потому, что что-то менее популярно, это не означает, что все, кроме Google, избегают этого. Есть люди за пределами Google, которые следуют этому же соглашению. И есть люди, которые не следуют практике, но считают, что это совершенно приемлемо. Я не помню, чтобы встретил любого, кто был против этого. В конечном итоге это стиль мнения больше, чем догма. – Cornstalks

+1

Если вы не будете вынуждены использовать это руководство на работе, я бы не советовал его использовать. Прочитайте [это] (https://www.linkedin.com/pulse/20140503193653-3046051-why-google-style-guide-for-c-is-a-deal-breaker) – 0x499602D2

ответ

2

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

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

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

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

+0

Это правда? Конечно, код может принимать параметр по ссылке const, а затем принимать его адрес, отбрасывать const и добавлять на него. Это ничего не нарушает в спецификации C++, поэтому оптимизатор не может изменить эффект. –

+0

@DavidSchwartz: «Если у вас нет кросс-файловой компиляции». Поэтому (намеренно или иначе) он говорит о функции с внутренней связью, которая может быть полностью оптимизирована w.r.t. его вызовы [в том же ТУ]. Теперь это довольно глупо, чтобы воспитывать, потому что это очень редкая ситуация. Но это не делает его заявление неправильным. –

+1

@DavidSchwartz: Я могу ошибаться в этом, но я думаю, что компилятору разрешено делать предположения об псевдониме. т.е. если вы передадите '& a [i]' функции в качестве неконстантного указателя, компилятору необходимо будет перезагрузить 'a [i + 1]' после вызова, даже если бы оно имело значение в спасброске регистр. Это не так, если вы передали 'a [i]' неконстантной ссылкой. Я не могу ошибаться, я не читал недавно. –

Смежные вопросы