Прямой вызов против косвенного вызова в C - PullRequest
1 голос
/ 04 апреля 2010

Я новичок в C, и я читал о том, как указатели "указывают" на адрес другой переменной. Поэтому я попробовал косвенный вызов и прямой вызов и получил те же результаты (что и предсказывал любой разработчик C / C ++). Вот что я сделал:

int cost;
int *cost_ptr;

int main()
{
    cost_ptr = &cost;                          //assign pointer to cost
    cost = 100;                                //intialize cost with a value
    printf("\nDirect Access: %d", cost);
    cost = 0;                                  //reset the value
    *cost_ptr = 100;
    printf("\nIndirect Access: %d", *cost_ptr);
    //some code here

    return 0;                                  //1
}

Поэтому мне интересно, имеет ли косвенный вызов с указателями какие-либо преимущества по сравнению с прямым вызовом или наоборот? Некоторые преимущества / недостатки могут включать скорость, объем памяти, потребляемой при выполнении операции (скорее всего, такой же, но Я просто хотел это показать), безопасность (например, висячие указатели), хорошая практика программирования и т. Д.
1 Забавно, я использую компилятор GNU C (gcc), и он все еще компилируется без оператора return, и все идет так, как ожидалось. Возможно, потому что компилятор C ++ автоматически вставит оператор return, если вы забудете.

Ответы [ 3 ]

6 голосов
/ 04 апреля 2010

Косвенный и прямой вызов используются в разных местах. В вашем примере предпочтительным является прямой вызов. Некоторые причины использовать указатели:

  • При передаче большой структуры данных в функцию можно передать указатель вместо копирования всей структуры данных.
  • Если вы хотите, чтобы функция могла изменять переменную в вызывающей функции, вы должны передать указатель на исходную переменную. Если вы передадите его по значению, вызываемая функция просто изменит копию.
  • Если вы не знаете точно, какое значение вы хотите передать во время компиляции, вы можете установить указатель на правильное значение во время выполнения.
  • При динамическом выделении блока памяти необходимо использовать указатели, поскольку место хранения неизвестно до времени выполнения.
1 голос
/ 04 апреля 2010

Обозначение указателя включает две выборки из памяти (или одну выборку и одну запись), где прямой вызов включает одну.

Поскольку доступ к памяти медленный (по сравнению с вычислениями в регистрах; быстрый по сравнению с доступом на диске), доступ по указателю замедлит работу.

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

0 голосов
/ 04 апреля 2010

В случае «printf (..., * cost)» значение «cost» копируется в стек. Хотя в данном случае это тривиально, представьте, что вы вызываете другую функцию, а «cost_ptr» указывает на мультимегабайтная структура данных.

...