Эффективна ли передача статического массива в функцию?
#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
}
Я хочу знать следующее:
Я создал статический массив, как показано выше "основной" функции. Это эффективно? Было бы лучше, если бы я использовал точку и malloc вместо этого?
Я знаю, что он не использует стек, поэтому, когда я передам массив во внутренние функции, он создаст копию всего массива или просто отправит местоположение первой записи?
Работая над "массивом" в функции "myfunc", я работаю напрямую со статическим определенным массивом или какой-то локальной копией?
Внутри функции "myfunc", когда мы передадим массив в функцию "myfuncinfunc", будет ли он снова, отправлять только первое местоположение или полную копию массива в стек?
Спасибо за чтение вопроса и буду очень признателен за любую помощь! Я новичок в C и пытаюсь узнать это из интернета.
2 ответа
- Я не понимаю, как это будет более или менее эффективно, чем массив в куче.
- Разлагается в указатель на первую запись.
- Поэтому это не локальная копия, а сам массив.
- То же самое.
Кстати, если a
а также b
индексы в массиве, рассмотрите возможность использования size_t
типа для них (это unsigned int
гарантированно достаточно большой для индексации массивов).
- Я создал статический массив, как показано выше "основной" функции. Это эффективно? Было бы лучше, если бы я использовал точку и malloc вместо этого?
Определите "эффективный". Статически распределенные массивы всегда быстрее динамических, из-за накладных расходов времени выполнения для выделения / освобождения.
В этом случае вы выделяете огромное количество в 100 Кбайт, что может быть очень неэффективно для памяти.
Кроме того, у вашего процесса может быть недостаточно доступной статической памяти, в зависимости от ОС. Поэтому в настольных системах рекомендуется распределять в куче всякий раз, когда вы используете большие объемы данных.
- Я знаю, что он не использует стек, поэтому, когда я передам массив во внутренние функции, он создаст копию всего массива или просто отправит местоположение первой записи?
Вы не можете передавать массивы по значению в C. Таким образом, указатель на первый элемент массива будет сохранен в стеке и передан функции.
- Работая над "массивом" в функции "myfunc", я работаю напрямую со статическим определенным массивом или какой-то локальной копией?
Прямо на статический массив. Опять же, вы не можете передавать массивы по значению.
Внутри функции "myfunc", когда мы передадим массив в функцию "myfuncinfunc", будет ли он снова, отправлять только первое местоположение или полную копию массива в стек?
Указатель на первый элемент.