|
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 87
|
||||||||||||||||
Модификатор const для переменных и функций C++15.02.2021, 14:30. Показов 3129. Ответов 40
Метки нет (Все метки)
Здравствуйте. У меня есть такая программа.
.h
Но еще ему не нравится фрагмент
Посмотрите пожалуйста, может я чего лишего понаставила или наоборот чего не хватает.
0
|
||||||||||||||||
| 15.02.2021, 14:30 | |
|
Ответы с готовыми решениями:
40
Использвать модификатор const для переменных и функций, для которых это имеет смысл
|
|
Комп_Оратор)
|
||||
| 16.02.2021, 02:42 | ||||
|
0
|
||||
|
Вездепух
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,307
|
|||||||
| 16.02.2021, 04:04 | |||||||
1
|
|||||||
|
"C with Classes"
|
||
| 16.02.2021, 06:42 | ||
|
IGPIGP, есть хорошая статья в книге "Шаблоны C++. Справочник разработчика | Джосаттис Николаи М., Грегор Дуглас" Глава 7. По значению или по ссылке?
... За сценой передача аргумента по ссылке осуществляется с помощью пере дачи адреса аргумента. Адреса кодируются компактно, так что передача адреса из вызывающей функции в вызываемую сама по себе эффективна. Однако при передаче адреса для компилятора создается некоторая неопределенность: что вызываемая функция делает с этим адресом? В теории вызываемый код может изменять все значения, до которых удается “добраться” с использованием этого адреса. Это означает, что компилятор должен считать, что все значения, которые он может кешировать (обычно в регистрах процессора), после вызова являются недействительными. Перезагрузка всех этих значений может оказаться довольно дорогой. Вы можете возразить, что мы передаем константную ссылку: не может ли компилятор на этом основании определить, что никакие изменения не могут произойти? К сожалению, это не так, потому что вызывающий код может изме нить объект через свою собственную, не константную ссылку. Эти плохие новости смягчаются применением встраивания: если компилятор мо жет развернуть вызов как встроенный, он может увидеть вызывающий и вызывае мый код вместе и во многих случаях “понять”, что адрес не используется ни для чего, кроме передачи указываемого им значения. Шаблоны функций часто очень корот кие и потому являются вероятными кандидатами для встраивания. Однако, если шаблон инкапсулирует более сложный алгоритм, встраивание вряд ли произойдет. (Еще одним, более явным способом изменения объекта является применение const_cast.) ... Добавлено через 16 минут
1
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||||||||
| 16.02.2021, 08:34 | ||||||||||||
|
Например
restrict, которое есть в С, а в С++ многие его давно просят. Но в общем случае проблема все равно останется. См. ниже.Это был простой пример, но может быть и более изощренный вариант, например так:
1
|
||||||||||||
|
Комп_Оратор)
|
||
| 16.02.2021, 10:59 | ||
somefunc(); имеет доступ к переменной не получив её как параметр. Разве-что если это колбэк с вызывающей стороны. Но в и этом случае, возможно это то, чего желает программист... В принципе, убедили, - может кому-то и понравится и пригодится. Но это уж точно не тот случай, когда нужно скрыть от пользователя, в реализации, константность объявленного параметра. Тут как раз полезно показать ведь?
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|
| 16.02.2021, 11:06 | |
|
IGPIGP, константность передаваемого по значению параметра в определении функции - это, так сказать, фича самодокументирующегося кода. Т.е. дополнительный визуальный и автоматизированный контроль корректности. С другой стороны - пользователю функции эта информация не нужна (какая ему разница контролирует ли функция в своей реализации неизменность параметра или нет?), поэтому, чтобы его не удивлять, из объявления можно const убрать.
Но, справедливости ради, на практике я очень редко такой подход наблюдал.
0
|
|
|
"C with Classes"
|
||
| 16.02.2021, 11:10 | ||
|
Добавлено через 3 минуты и какая практика чаще наблюдается?, если аргумент по значению передается.
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 16.02.2021, 11:12 | ||
|
1) Ссылку можно использовать, когда накладные расходы от косвенной адресации не важны или отсутствуют (например при встраивании функции их не будет) 2) По значению можно передавать когда а) Мы точно знаем, что будет лучше или по крайней мере не хуже по объему передаваемых данных (см, например, спецификацию x64 ABI, и правила передачи параметров через регистры) б) Нам по каким-то причинам важно избегать косвенной адресации даже в ущерб накладному копированию (например функция работает долго, постоянно обращается к данным, а копирование можно сделать один раз при вызове, т.е. не смотря на дорогое копирование, его влияние минимально за счет того, что выполняется оно один раз). Точный ответ, как обычно, можно получить с помощью профилировщика
1
|
||
|
"C with Classes"
|
||
| 16.02.2021, 11:16 | ||
|
0
|
||
|
Комп_Оратор)
|
||
| 16.02.2021, 11:21 | ||
|
_stanislav, то, что компилятор не может сделать предположений о том что вызывающий код не изменит объект по ссылке (или константному указателю, кстати тоже), это понятно. Я не спорю с ружьём на стене, даже если оно не заряжено. Получить заряд из незаряженного ружья ещё обиднее. Но против лома нет приёма. Если не лочить в многопоточке, делать неосторожные вещи при колбеках или использовать глобальный доступ, то это не намного лучше чем прямо внутри функции установить на "одетую в броню" свечу константную ссылку и ... далее по тексту (скастить, отдать в код который это сделает и пр.) Для того и используется принцип "разделяй и властвуй", - модульность, локальность и пр., чтобы ружье не поскакало. Вместе с избушкой. Мне приходилось видеть функции (в серьёзных проектах, кстати), которые не влазили в 5 экранов... Их все боялись трогать. Ни кто не может помешать кому-то творить такое. Обезопасить такого человека, это только загонять проблему под ковёр.
Добавлено через 4 минуты ))? Но здоровый сон, ведь дорого стоит? Случай то ведь необычный. Но в принципе понятно, - спасибо)
1
|
||
|
"C with Classes"
|
||
| 16.02.2021, 11:22 | ||
|
0
|
||
|
Комп_Оратор)
|
||
| 16.02.2021, 11:32 | ||
|
_stanislav, понимаешь, если передача родственной семантики вариируется, это ведёт к комбинаторному росту специализаций шаблонов, где потом можно такую функцию передать. Это как для указателей специализировать передачу указателя на char)) Нюансы дорого стоят. Хотя без них медленно и тупо. Вечная дилемма)
1
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|
| 16.02.2021, 11:52 | |
|
0
|
|
| 16.02.2021, 11:55 | |
|
Не по теме:
0
|
|
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 16.02.2021, 12:00 | ||
|
Ну и от задачи зависит же. Вдруг "сверхгигантское" копирование - это часть бизнес-логики? ![]() На самом деле все правильно, константная ссылка - можно сказать, что вариант по умолчанию. В современном С++ добавилась семантика перемещения, и теперь нужно еще следить когда она уместнее, чем передача по (константной) ссылке. Но в целом все остается на прежнем уровне (т.е. как написано в книгах по эффективному С++). Профилировщик покажет где была упущена производительность, а вещи, о которых я говорил выше, просто помогут правильно проинтерпретировать результат и сделать в коде соответствующие изменения.
2
|
||
|
Комп_Оратор)
|
||||
| 16.02.2021, 12:16 | ||||
|
Есть и более простое объяснение.
0
|
||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|
| 16.02.2021, 12:25 | |
|
0
|
|
|
"C with Classes"
|
||
| 16.02.2021, 12:32 | ||
|
0
|
||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 16.02.2021, 12:35 | ||
|
1
|
||
|
"C with Classes"
|
||
| 16.02.2021, 12:38 | ||
const int, вообще о такой технике никто не упоминал никогда, сколько я не читал.
0
|
||
| 16.02.2021, 12:38 | |
|
Модификатор доступа const Модификатор static для функций, используемых в main Модификатор const Очередные грабли с++? Модификатор const в качестве возвращаемого значения
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов
Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
|
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация
В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
|