Другие языки программирования и технологии
Почему в C++ передача аргумента функции по значению считается более быстрой, чем по ссылке?
Удивился, когда прочел это в учебнике, т. к. всегда думал обратное.
Это зависит от конкретной ситуации (тем более при таких навороченных оптимизациях, как в компиляторах C++), но бывает, причём достаточно часто. Например, если значение переменной в данный момент находится в регистре, то при передаче по ссылке нужно:
1) сначала поместить это значение в память, выделенную для переменной;
2) вычислить точный адрес этой памяти, который на этот момент неизвестен, т. к. для адресации переменных используются относительные адреса (относительно ebp);
3) поместить этот адрес в стек.
Итого - 3 операции, примерно так:
mov [ebp - 10], eax
lea eax, [ebp - 10]
push eax
А для передачи значения из регистра достаточно одной операции - сразу отправить его в стек:
push eax
1) сначала поместить это значение в память, выделенную для переменной;
2) вычислить точный адрес этой памяти, который на этот момент неизвестен, т. к. для адресации переменных используются относительные адреса (относительно ebp);
3) поместить этот адрес в стек.
Итого - 3 операции, примерно так:
mov [ebp - 10], eax
lea eax, [ebp - 10]
push eax
А для передачи значения из регистра достаточно одной операции - сразу отправить его в стек:
push eax
Выбрось этот учебник.
тут надо знать ассемблер. я точно не скажу, но вижу так.
при передачи значения они загружаются в стек и потом выбираются из него. к примеру положить и взять значение будет 2 такта процессорного времени. если передавать по ссылке, то скажем положить ссылку и взять ее будет те же 2 такат, + такт на загрузку значения по ссылке.
с количеством тактов вру, но вижу как то так. хочешь проверить - напиши 2 проги и проверь машинные коды.
при передачи значения они загружаются в стек и потом выбираются из него. к примеру положить и взять значение будет 2 такта процессорного времени. если передавать по ссылке, то скажем положить ссылку и взять ее будет те же 2 такат, + такт на загрузку значения по ссылке.
с количеством тактов вру, но вижу как то так. хочешь проверить - напиши 2 проги и проверь машинные коды.
Ссылка вообще не объект. Поэтому ничего не копируется.
Объект - это объект, поэтому при передаче по значению, вовнутрь функции копируется каждый его бит.
Потому и быстрее.
По ссылке.
Ещё раз учебник прочти, ты перепутал.
Или учебник дрянь.
Объект - это объект, поэтому при передаче по значению, вовнутрь функции копируется каждый его бит.
Потому и быстрее.
По ссылке.
Ещё раз учебник прочти, ты перепутал.
Или учебник дрянь.
Похожие вопросы
- C++ Указатели и функции.
- Массив как аргумент функции C++
- Описать функцию в c++, которая находит среднее арифметическое значение всех элементов сформированного непустого списка
- Напишите пожалуйста функцию обмена значений двух переменных на си (не c++) для любого типа данных
- Составить подпрограмму-функцию вычисления значений интеграла методом Симпсон.
- C++. Вопрос по функции memmove()
- Помогите написать программу на c++ С использованием функций
- Почему в C++ заголовки функций и код принято хранить в отдельных файлах?
- C++ структуры и функции
- Что значит "функция возвращает значение" в С++?