как создать 4096 выровненную таблицу [x] [4096]

Я хочу получить таблицу [x] [4096] (например, int table [4096] [4096])
но я не уверен, как это сделать — особенно в более общем смысле (это
на многих компиляторах также старые (mingw, dmc, lcc, b55)

Я хочу получить таблицу с заполнением каждой строки в одну (или многократную) систему
страница (для эффективности, это будет быстрее? насколько я знаю, это может)
поэтому я хочу получить массив Энн, который заполняет набор системных страниц и
очень привязан к ним

(Я не хочу ошибок и пустых мест на страницах)

1) можно ли получить статический массив таким образом (во многих компиляторах)
2) как это можно сделать malloc способом? (Смутно помню, что malloc
может поместить некоторые метаданные перед ОЗУ, который он выделяет, чтобы это испортило изображение,
возможно это также не выделяет точное количество байтов (?), но я не уверен
к этому

Могу ли я получить такое четкое распределение — например, 256 выровненных страниц 4K в виде таблицы?

1

Решение

Вы можете перераспределить и настроить указатель:

 int *a = malloc(4096*4096*4+4095);
int *b = (int*) (((int)a)+4095 & (~4095)));

Также возможно (но не гарантировано), что человек выделяет, например, 64 + 64 байта, находит, что адреса находятся на расстоянии 80 байтов, а затем вычисляет длину следующей единицы L выделения, чтобы заставить большую единицу выровняться по данному адресу.

#include <string.h>
#include <stdio.h>
int main()
{
int *a = malloc(64);
int *b = malloc(64);
long long excess = ((long)b - (long)a)-64;
int *c = malloc(4096 - (((int)(b) & 4095) + excess*2 + 64));
int *d = malloc(4096*4);
printf("%x %x %x %x\n",
(int)a & 0xffffffff,(int)b & 0xffffffff,
(int)c & 0xffffffff,(int)d & 0xffffffff);
}

Выход: 18e2010 18e2060 18e20b0 18e3000

Одно замечание: последний malloc для d = malloc (4096 * 4096) не удалось (и выдает 0x55505010), потому что реализация glib выделяет блоки разных размеров из разных пулов или с разными методами (например, системный вызов kmalloc). Первый выделенный адрес каждого прогона, похоже, смещен ровно на 10 (шестнадцатеричных) байтов, потому что это пространство, необходимое для бухгалтерии, и, очевидно, куча уже выровнена системой по границе 4096 байтов.

0

Другие решения

Функция выделения страниц в Windows VirtualAlloc, Пройти оба MEM_COMMIT | MEM_RESERVE чтобы получить фактическое распределение, а не просто бронирование.

2

Поскольку вопрос помечен как winapi, я предполагаю, что вы используете Windows.
В этом случае вы, вероятно, хотите просто использовать _aligned_malloc().

В системах Linux / POSIX есть posix_memalign().

Используя один из этих API, вы должны выделить большой блок памяти, который будет выровнен до 4 КБ. Тогда вам просто нужно получить к нему доступ, используя обычные указатели.

1

Вы можете выполнить требуемое выравнивание, но оно не будет переносимым, поскольку в нем нет стандартных инструкций. C/C++ для определения выравнивания.

Для статических данных обычно #pragma или встроенные функции компилятора.

Например, в VC ++ есть __declspec( align( # ) ) которые могут быть использованы для выравнивания данных: http://msdn.microsoft.com/en-us/library/83ythb65(v=vs.110).aspx

Для динамических данных это то же самое непереносимое решение, подробности смотрите в ответе @mvp. Однако для динамических данных вы можете реализовать свой собственный распределитель выравниваемых данных, основанный на стандартном malloc функция. Поскольку он основан на стандартной библиотеке, ваш распределитель будет переносимым.

1
По вопросам рекламы [email protected]