Параметры функции C++: используйте ссылку или указатель (и затем разыменуйте)?

StringEscapeUtils.unescapeXml(xml)

( commons-lang , скачать )

17
задан Community 23 May 2017 в 12:01
поделиться

9 ответов

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

20
ответ дан 30 November 2019 в 10:18
поделиться

С точки зрения производительности это, вероятно, не имеет значения. Другие уже ответили на этот вопрос.

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

14
ответ дан 30 November 2019 в 10:18
поделиться

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

10
ответ дан 30 November 2019 в 10:18
поделиться

Это будет отклонено, так как это Old Skool, но я часто предпочитаю указатели, так как проще просто взглянуть на код и посмотреть, мои объекты, которые я передаю функции, могут быть изменены, особенно если это простые типы данных, такие как int и float.

5
ответ дан 30 November 2019 в 10:18
поделиться

Вот разница в сгенерированной сборке с 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 .

3
ответ дан 30 November 2019 в 10:18
поделиться

Ссылки очень похожи на указатели с одним большим отличием: ссылки не могут быть NULL. Так что вам не нужно проверять, являются ли они реально используемыми объектами (например, для указателей).

Поэтому я предполагаю, что компиляторы будут генерировать один и тот же код.

1
ответ дан 30 November 2019 в 10:18
поделиться

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

0
ответ дан 30 November 2019 в 10:18
поделиться

Существуют разные рекомендации по использованию параметров ссылки и указателя, адаптированные к различным требованиям. На мой взгляд, наиболее значимое правило, которое следует применять при разработке универсального C ++, следующее:

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

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

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

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

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

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

5
ответ дан 30 November 2019 в 10:18
поделиться

Просто запустите foo.exe ? Вам нужно добавить / WAIT , чтобы сделать паузу.

Соль может быть продуктом существующего материала (например, UserID и др.) Или генерироваться случайным образом. Преимущество состоит в том, что атака на зашифрованную информацию становится все более непрактичной по мере того, как сила соли растет.

Помните: любой криптографический алгоритм взломан. Информация может считаться "безопасной" только в том случае, если взлом защиты (с помощью радужной таблицы или иным образом) стоит дороже, чем ее ценность.

edit:

Предполагая, что вы новичок в криптографии, вот еще несколько советы:

  • Более длинные соли лучше, чем короткие.
  • Чем больше возможных значений для соли, тем лучше. Буквенно-цифровая соль лучше, чем числовая. Бинарная соль лучше, чем буквенно-цифровая.
  • Соли не сделают грубую силу атак с меньшей вероятностью против одного пароля. Я думаю, что первая функция превосходит другую с точки зрения удобочитаемости, потому что вызов, подобный

    f( &a, &b );
    

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

    f( a, b );
    

    . Для меня было бы довольно удивительно увидеть, что a изменилось после вызова, потому что я не могу сказать из вызова, что переменная передается по ссылке .

1
ответ дан 30 November 2019 в 10:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: