2015-02-25 4 views
2

В C, если структура имеет несколько элементов, и вы хотите использовать только некоторые из этих элементов в функции, лучше ли передать указатель на структуру или я должен сам передать эти элементы? Или это не имеет значения?Пропустить struct vs отдельные элементы структуры

Если у меня есть, например:

struct Test { 
    int a1, a2, a3, a4, a5, a6, a7, a8; 
}; 

и функции, использующей a1, a2, a3, a4, я должен использовать

void f(struct Test*); 

или

void f(int, int, int, int); 
+0

Я бы передал только то, что мне нужно, то есть отдельные элементы структуры. – cdonts

+0

Но тогда я передаю несколько вещей, а не только указатель. Лучше другого? – user1801359

+0

Скорее всего, это будет закрыто, потому что оно субъективно. Но за два года я бы сказал, что это зависит от функции. Если ваша функция может использоваться только с этой структурой (несмотря только на использование подмножества полей), то передать структуру. Если у него есть вероятность повторного использования в других местах путем передачи отдельных полей, тогда имеет смысл это сделать. – Benj

ответ

4

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

Какой выглядит лучше? Это субъективно, нет справа ответ.

+1

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

+0

@thang Это верно, спасибо за улучшение :-) – cdonts

1

Если функция предназначена для работы со структурой, то, конечно, лучше объявить это нравится:

void f(struct Test*); 

или

void f(struct Test); 

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

С другой стороны, если функция предназначена для решения некоторых четырех целочисленных значений, то лучше объявить его как это:

void f(int *, int *, int *, int *); 

или

void f(int, int, int, int); 

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

1

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

void f(const struct Test*);

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

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