Разница между этими двумя структурами использования - PullRequest
1 голос
/ 21 мая 2019

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

#include <stdio.h>

typedef struct Person{
    int age;
    int id;
} person;

static void foo(person *p1);

int main()
{
    person per1;
    person per2[1];

    foo(&per1); /*1*/
    foo(per2); /*2*/

    printf("per1. Age: %i; id: %i\n",per1.age,per1.id);
    printf("per2. Age: %i; id: %i\n",per2->age,per2->id);

    return 0;
}
static void foo(person *p1)
{
    p1->age=10;
    p1->id=123;
}

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

Ответы [ 2 ]

8 голосов
/ 21 мая 2019

Любой современный компилятор будет выдавать идентичный машинный код в каждом случае, поэтому проблем с производительностью нет. ( См. Годболт ).

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

1 голос
/ 21 мая 2019

Оба верны. Какой из них лучше, зависит от ваших потребностей.

per1 имеет тип person (в torn это typedef из struct Person), поэтому, если вы хотите передать его, вы передаете его адрес (как вы делали с помощью оператора &).

per2 - это массив person s, поэтому его тип на самом деле является массивом address , и поэтому вы можете передать его как есть. Если вам не нужен массив person, используйте первый вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...