Эффективна ли передача статического массива в функцию?

#define BUFF_SIZE 100000
unsigned char buffer[BUFF_SIZE];

void myfunc(unsigned char[],int,int);
void myfuncinfunc(unsigned char[],int,int);

int main()
{
int a = 10, b = 10;
myfunc(buffer,a,b);
}

void myfunc(unsigned char array[],int a,int b)
{
int m,n;
//blah blah
myfuncinfunc(array,m,n);
}

void myfuncinfunc(unsigned char array[],int a, int b)
{
//blah blah
}

Я хочу знать следующее:

  1. Я создал статический массив, как показано выше "основной" функции. Это эффективно? Было бы лучше, если бы я использовал точку и malloc вместо этого?

  2. Я знаю, что он не использует стек, поэтому, когда я передам массив во внутренние функции, он создаст копию всего массива или просто отправит местоположение первой записи?

  3. Работая над "массивом" в функции "myfunc", я работаю напрямую со статическим определенным массивом или какой-то локальной копией?

  4. Внутри функции "myfunc", когда мы передадим массив в функцию "myfuncinfunc", будет ли он снова, отправлять только первое местоположение или полную копию массива в стек?

Спасибо за чтение вопроса и буду очень признателен за любую помощь! Я новичок в C и пытаюсь узнать это из интернета.

2 ответа

  1. Я не понимаю, как это будет более или менее эффективно, чем массив в куче.
  2. Разлагается в указатель на первую запись.
  3. Поэтому это не локальная копия, а сам массив.
  4. То же самое.

Кстати, если a а также b индексы в массиве, рассмотрите возможность использования size_t типа для них (это unsigned int гарантированно достаточно большой для индексации массивов).

  1. Я создал статический массив, как показано выше "основной" функции. Это эффективно? Было бы лучше, если бы я использовал точку и malloc вместо этого?

Определите "эффективный". Статически распределенные массивы всегда быстрее динамических, из-за накладных расходов времени выполнения для выделения / освобождения.

В этом случае вы выделяете огромное количество в 100 Кбайт, что может быть очень неэффективно для памяти.

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

  1. Я знаю, что он не использует стек, поэтому, когда я передам массив во внутренние функции, он создаст копию всего массива или просто отправит местоположение первой записи?

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

  1. Работая над "массивом" в функции "myfunc", я работаю напрямую со статическим определенным массивом или какой-то локальной копией?

Прямо на статический массив. Опять же, вы не можете передавать массивы по значению.

Внутри функции "myfunc", когда мы передадим массив в функцию "myfuncinfunc", будет ли он снова, отправлять только первое местоположение или полную копию массива в стек?

Указатель на первый элемент.

Другие вопросы по тегам