2015-01-16 1 views
2

В чем причина возврата указателя на структуру при создании ADT в C? например:C ADT - Почему функция инициализации обычно возвращает указатель?

typedef struct some_thing st_t; 

// system interface 
st_t* init_system(); 

.
.
несколько функций
.
.
Неправильно ли возвращать структуру, а не указатель на структуру?

+2

Если вы вернули структуру, то вы потеряете A от ADT –

+0

Возможно, функция init выделяет память. – saadtaame

+0

Одновременно может быть много причин. Было бы проще использовать не общий пример. – keltar

ответ

0

Преимущество возврата указателя на структуру состоит в том, что содержимое структуры не нужно копировать в вызывающую функцию.

+0

На платформах x86_64 (и ARM, если я не ошибаюсь) большие значения возврата реализуются как аргументы скрытого указателя, т. Е. 'Struct x foo (void);' преобразуется в 'void foo (struct x * x);'. – diapir

+0

Это сложнее, чем это. В конце концов, как можно скопировать содержимое неполного типа? –

+0

@DavidHeffernan: Мой комментарий не имеет ничего общего с непрозрачными типами, я просто указывал, что на многих современных платформах (System V x86-64, Win64 ...) большие значения не _copied_. – diapir

3

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

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

Это позволяет обновить библиотеку (через общую библиотеку/dll) без необходимости перекомпилировать вызывающее приложение.

2

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

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

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