StringEscapeUtils.unescapeXml(xml)
( commons-lang , скачать )
Мое практическое правило - передавать по указателю, если параметр может иметь значение NULL, т.е. необязательный в приведенных выше случаях, и ссылаться, если параметр никогда не должен иметь значение NULL.
С точки зрения производительности это, вероятно, не имеет значения. Другие уже ответили на этот вопрос.
Сказав это, я еще не нашел ситуации, когда добавленная инструкция в этом случае имела бы заметную разницу. Я понимаю, что для функции, которая вызывается миллиарды раз, это может иметь значение. Как правило, вам не следует адаптировать свой стиль программирования для такого рода «оптимизаций».
Вы можете получить ассемблерный код из вашего компилятора и сравнить их. По крайней мере, в GCC они производят идентичный код.
Это будет отклонено, так как это Old Skool, но я часто предпочитаю указатели, так как проще просто взглянуть на код и посмотреть, мои объекты, которые я передаю функции, могут быть изменены, особенно если это простые типы данных, такие как int и float.
Вот разница в сгенерированной сборке с g ++. a.cpp
- указатели, b.cpp
- ссылки.
$ g++ -S a.cpp
$ g++ -S b.cpp
$ diff a.S b.S
1c1
< .file "a.cpp"
---
> .file "b.cpp"
4,6c4,6
< .globl __Z7MyFunc1PiS_
< .def __Z7MyFunc1PiS_; .scl 2; .type 32; .endef
< __Z7MyFunc1PiS_:
---
> .globl __Z7MyFunc1RiS_
> .def __Z7MyFunc1RiS_; .scl 2; .type 32; .endef
> __Z7MyFunc1RiS_:
Просто имя функции немного отличается; содержимое идентично. У меня были идентичные результаты, когда я использовал g ++ -O3
.
Ссылки очень похожи на указатели с одним большим отличием: ссылки не могут быть NULL. Так что вам не нужно проверять, являются ли они реально используемыми объектами (например, для указателей).
Поэтому я предполагаю, что компиляторы будут генерировать один и тот же код.
Вы должны увидеть сгенерированный ассемблерный код для целевой машины ... примите во внимание, что вызов функции всегда выполняется в постоянное время, а на реальных машинах это время составляет действительно незначительно ...
Существуют разные рекомендации по использованию параметров ссылки и указателя, адаптированные к различным требованиям. На мой взгляд, наиболее значимое правило, которое следует применять при разработке универсального C ++, следующее:
Используйте ссылочные параметры при перегрузке операторов. (В этом случае у вас фактически нет выбора. Это то, для чего в первую очередь были введены ссылки.)
Используйте константную ссылку для составных (то есть логически «больших») входных параметров. То есть входные параметры должны передаваться либо по значению («атомарные» значения), либо по константной ссылке («агрегированные» значения). Используйте указатели для выходных параметров и входных-выходных параметров. Не используйте ссылки для выходных параметров .
Принимая во внимание вышесказанное, подавляющее большинство ссылочных параметров в вашей программе должны быть константными ссылками. Если у вас есть неконстантный ссылочный параметр, и он не является оператором, рассмотрите возможность использования вместо него указателя.
Следуя вышеуказанному соглашению, вы сможете увидеть в точке вызова, может ли функция изменить один из своих аргументов: потенциально измененные аргументы будут переданы с явными и
или уже -существующие указатели.
Есть еще одно популярное правило, которое гласит, что что-то, что может быть нулевым, должно передаваться как указатель, а то, что не может быть нулевым, должно передаваться как ссылка. Я могу представить, что это может иметь смысл в некоторых очень узких и очень конкретных обстоятельствах, но в целом это серьезное антиправило. Просто не делай Не делай так. Если вы хотите выразить тот факт, что какой-то указатель не должен быть нулевым, поместите соответствующее утверждение в самой первой строке вашей функции.
Что касается соображений производительности, нет абсолютно никакой разницы в производительности при передаче по указателю или передаче по ссылке . Оба типа параметров на физическом уровне абсолютно одинаковы. Даже когда функция встроена, современный компилятор должен быть достаточно умен, чтобы сохранить эквивалентность.
Просто запустите foo.exe
? Вам нужно добавить / WAIT
, чтобы сделать паузу.
Помните: любой криптографический алгоритм взломан. Информация может считаться "безопасной" только в том случае, если взлом защиты (с помощью радужной таблицы или иным образом) стоит дороже, чем ее ценность.
edit:
Предполагая, что вы новичок в криптографии, вот еще несколько советы:
f( &a, &b );
, ясно выражает, что передается ссылка на некоторую переменную (которая, как мне кажется, звучит как «этот объект может быть изменен функция 'звонок'). Версия, которая принимает ссылки вместо указателей, просто выглядит как
f( a, b );
. Для меня было бы довольно удивительно увидеть, что a
изменилось после вызова, потому что я не могу сказать из вызова, что переменная передается по ссылке .