Представьте, что у меня есть структура, которая содержит набор переменных, которые описывают объект, который в моем случае является сеткой. Мне было интересно, если у меня есть функция, которая использует только подмножество сетки, есть ли какие-либо различия в производительности в двух вариантах computational_kernel
функции ниже. Ядра одинаковы, за исключением того, что ядро, в котором передается структура, должно извлечь itot
, jtot
а также ktot
от структуры до тяжелых вычислений.
struct Grid
{
int itot;
int jtot;
int ktot;
int not_used_in_kernel1;
int not_used_in_kernel2;
int not_used_in_kernel3;
int not_used_in_kernel4;
}
Grid grid;
// Code that initializes the grid values...
// Variant 1
computational_kernel(double* array1, double* array2,
const int itot, const int jtot, const int ktot);
// Variant 2
computational_kernel(double* array1, double* array2,
const Grid& grid);
Если computational_kernel
это функция, которая выполняет много работы внутри и вызывается несколько раз, разница между двумя версиями бесконечно мала. Вторая версия имеет только дополнительную стоимость разыменования 3 значения, чем остальные идентичны, и вам, вероятно, придется делать такую разыменование в любом случае, прежде чем вызывать первую версию.
Я бы определенно использовал вторую форму по соображениям компактности: если вы определяете объектно-ориентированные структуры данных, используйте их таким образом (лучше инкапсуляция).
Я думаю, что передача структуры лучше для поддержки кода. если вы добавите новые поля в свою сетку, вам нужно будет только изменить функцию. Но, передавая набор переменных, вы должны будете изменить функцию и каждый вызов функции.
Я бы сказал, что передача ссылки на структуру, как во втором варианте, вероятно, будет более эффективной с точки зрения производительности. В первом варианте вызывающей стороне необходимо поместить 3 переменные типа int в стек, в то время как во втором варианте все, что ему нужно, — это ссылка (указатель) на структуру и выполнить всю работу там. Влияние на производительность, конечно, больше, если вам нужно передать более 3 переменных.