Есть два способа выделения глобального массива в C:
-
статически
char data[65536];
-
динамически
char *data; … data = (char*)malloc(65536); /* or whatever size */
Вопрос в том, какой метод имеет лучшую производительность? И на сколько?
Как понятно, первый метод должен быть быстрее.
Поскольку со вторым методом для доступа к массиву вы должны обращаться к адресу разыменования элемента каждый раз, когда он обращается, например:
- прочитайте переменную
data
, которая содержит указатель на начало массива - вычислить смещение для конкретного элемента
- доступ к элементу
При первом методе компилятор жестко кодирует адрес переменной data
в код, первый шаг пропускается, поэтому мы имеем:
- вычислить смещение для определенного элемента по фиксированному адресу, определенному во время компиляции
- получить доступ к элементу массива
Каждый доступ к памяти эквивалентен примерно 40 тактам процессора, поэтому, используя динамическое распределение, специально для нечетких чтений может иметь значительное снижение производительности и статическое распределение, поскольку переменная data
может быть удалена из кэша более часто доступная переменная. Напротив, стоимость разыменования статически назначенной глобальной переменной равна 0, так как ее адрес уже закодирован в коде.
Правильно ли это?