C/C++
Почему при работе с небольшими объёмами данных передача параметров по адресу может быть эффективнее, чем по значению?
И наоборот?
Скажем так, разница между передачей по адресу и по значению целого числа размером с указатель может иметь место быть в различных компиляторах или разных версиях, но делать какие-либо далеко идущие выводы из этого не стоит. В общих чертах при передаче единственного параметра размером в 32-бита на аналогичной архитектуре через fastcall происходит следующее:
В случае передачи по адресу на месте вызова в регистр ecx должен быть записан адрес переменной (известный во время компиляции, т.е. просто помещение числового значения в регистр), а в самой функции будет чтение памяти в какой-то регистр из этого адреса.
В случае передачи по значению на месте вызова будет произведено чтение памяти в регистр ecx значения переменной, а в самой функции можно будет работать с этим регистром сразу.
При таком раскладе экономится одна ассемблерная команда, время выполнения в тактах которой значительно меньше, чем чтение из памяти в регистр раз в 5-20. В действительности и этой экономии может не быть, так как значения уже могут быть подтянуты в кэш-память плюс к этому сгенерирован код вызова, время выполнения в тактах значительно выше, чем полученная экономия и ряд других условий которые могут изменить время работы обоих вариантов в произвольную сторону
В случае передачи по адресу на месте вызова в регистр ecx должен быть записан адрес переменной (известный во время компиляции, т.е. просто помещение числового значения в регистр), а в самой функции будет чтение памяти в какой-то регистр из этого адреса.
В случае передачи по значению на месте вызова будет произведено чтение памяти в регистр ecx значения переменной, а в самой функции можно будет работать с этим регистром сразу.
При таком раскладе экономится одна ассемблерная команда, время выполнения в тактах которой значительно меньше, чем чтение из памяти в регистр раз в 5-20. В действительности и этой экономии может не быть, так как значения уже могут быть подтянуты в кэш-память плюс к этому сгенерирован код вызова, время выполнения в тактах значительно выше, чем полученная экономия и ряд других условий которые могут изменить время работы обоих вариантов в произвольную сторону
эффективнее с точки зрения чего? ну вот есть память, а есть процессор. допустим ты передал данные по адресу, и у тебя какая-то логика, которая связана с проверками на то, чтобы не выйти за пределы определенные буфера, чтобы одна функция не перезатерла данные по ссылке так, чтобы другая функция что-то тааамм и тд. и вот всю эту парашу надо же в виде ифоф писать да?
вот выполнение всех этих ифов будет процессорное время жрать, но по памяти ты в выйгрыше, ты передал по ссылке же данные?
а если процессор слабый, а памяти много, может кусок данных просто скопировать и передать в функцию, чтобы раз-два сделал че-то и не паришься
вот выполнение всех этих ифов будет процессорное время жрать, но по памяти ты в выйгрыше, ты передал по ссылке же данные?
а если процессор слабый, а памяти много, может кусок данных просто скопировать и передать в функцию, чтобы раз-два сделал че-то и не паришься
Очевидно, это задача куда проще :)
Похожие вопросы
- Передача параметров в функцию по адресу.
- Передача параметров функцию.
- Не правильное значение по адресу памяти c++
- Как взять значение конкретного адреса в памяти?
- Передача данных в дочернюю программу и вывод из неё
- Почему не меняется значения в массиве
- Лабораторная работа. Классы. Передача объекта в качестве аргумента.
- Имя массива после инициализации принимает адрес в стеке, который указывает на адрес в куче? (Си)
- Помогите с сортировкой вектора объектов по 3 параметрам
- Параметр "All programs & Shaders" в программе NVIDIA Nsight Graphics
Потому что вопрос звучит так: почему одних случаях по адресу, в других - выгоднее по значению. Если с небольшими объёмами по значению - должно работать быстрее.