Какой лучший способ вернуть структуру из функции? - PullRequest
0 голосов
/ 30 апреля 2020

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

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

, какой метод лучше? Любая проблема в этом? или какое-либо предложение для нового метода?

возврат большой структуры как целого вызывает проблему стека?

file1. c

static struct_type mysruct; //Note : here struct size is 250+ bytes

//Method 1
struct_type getStructDataMethod1()
{
    return mysruct;
}

//Method 2
void getStructDataMethod2(struct_type *structPtr)
{
    if(structPtr != NULL)
    {
        memcpy(structPtr, &mysruct, sizeof(struct_type));
    }
}
//Method 3
void getStructDataMethod3(struct_type *structPtr)
{
    *structPtr = mysruct;
}

file2. c

void myFunction()
{
    struct_type mylocalStruct1 = getStructDataMethod1();
    struct_type mylocalStruct2;
    struct_type mylocalStruct3;

    getStructDataMethod2(&mylocalStruct2);
    getStructDataMethod3(&mylocalStruct3);

}

1 Ответ

2 голосов
/ 30 апреля 2020

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

Таким образом, метод 2 или 3 является правильным способом сделать это. Помимо проверки NULL-указателя, они эквивалентны.


Незначительная проблема, не связанная с вашим вопросом: никогда не пишите функции как void myFunction() в C, это устаревший стиль. Вместо этого используйте void myFunction(void).

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