2013-02-26 2 views
2

Рассмотрите тривиальный тест этой функции свопинга в 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++ действительно нет никакого истинного преимущества помимо кода neater?

+6

Ссылки ** являются ** указателями, они просто * выглядят * разными. Тем не менее, ничто не отличается от них. (За исключением того, что они не могут быть пустыми.) – Mehrdad

+0

@Mehrdad Итак, мое предположение было правильным, нет никакой функции, кроме как сделать код более аккуратным. – Leonardo

+3

Не просто аккуратный, но и безопасный, потому что ссылка не может быть NULL, как указатель. Но под капотом ссылки и указатели обычно производят один и тот же машинный код при компиляции. –

ответ

1

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

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

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

1

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

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

Смежные вопросы