Почему у C нет прохода по адресу / ссылке без указателей?

Рассмотрим тривиальный тест этой функции подкачки в C ++, которая использует проход по указателю.

#include <iostream>

using std::cout;
using std::endl;

void swap_ints(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
return;
}

int main(void)
{
int a = 1;
int b = 0;
cout << "a = " << a << "\t" << "b = " << b << "\n\n";
swap_ints(&a, &b);
cout << "a = " << a << "\t" << "b = " << b << endl;

return 0;
}

Эта программа использует больше памяти, чем если бы я прошел по адресу? Например, в этой функции decleration:

void swap_ints(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
return;
}

Использует ли эта версия функции C ++ по ссылкам меньше памяти, не создавая переменные-указатели?

И разве C не обладает такой же способностью «передача по ссылке», как C ++? Если так, то почему бы и нет, потому что это означает более эффективный код памяти, верно? Если нет, то в чём подводный камень того, что С не принимает эту способность. Я полагаю, что я не рассматриваю тот факт, что C ++, вероятно, создает указатели для достижения этой функциональности за кулисами. Это то, что на самом деле делает компилятор — и поэтому C ++ действительно не имеет никакого реального преимущества, кроме более аккуратного кода?

2

Решение

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

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

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

1

Другие решения

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

По своему дизайну C не имеет столько уровней абстракций, как C ++.

1

По вопросам рекламы [email protected]