Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

выровнять указатель

11K
11 июля 2008 года
zxc
11 / / 28.10.2005
Здраствуйте
не судите строго ибо только учусь
Такая проблема /на С /
нужно выделить память
и выровнять ее указатель на границу 4Кбайт

выделять ее я так понял можно ф-ей malloc,
а вот как потом этот указатель выравнивать
непонятно.

Подскажите кто чем
355
11 июля 2008 года
<SCORP>
786 / / 21.10.2006
выровнять - в смысле, чтобы выделилось количество памяти не меньшее заданого и кратное 4 килам??
9.3K
11 июля 2008 года
iridum
175 / / 26.08.2007
Я бы тоже хотел научится выравнивать указатель, а пока что я могу только так
 
Код:
char *str;
   str = (char *) malloc(4*1024); //выделить 4к  
   //и так
   str = (char *) realloc(str, 8*1024); //8k
355
11 июля 2008 года
<SCORP>
786 / / 21.10.2006
вы можете вдвоём объяснить мне, идиоту, чего вам надо сделать? :)
12K
11 июля 2008 года
lifs
163 / / 06.09.2007
<SCORP>, может имеют ввиду, что блок памяти должен начинатся с адреса, кратному 4kb?

В этом случае, либо выделить заранее 8kb с помощью malloc и использовать с нужного адреса, либо, если возможно, использовать VirtualAlloc
5
12 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: lifs
<SCORP>, может имеют ввиду, что блок памяти должен начинатся с адреса, кратному 4kb?

Вполне реальная ситуация, когда в некотором вычислительном алгоритме используются агрессивные оптимизации, учитывающие механизмы работы подсистемы памяти и кэша процессора. Касперский об этом рассказывал в одной из своих книг.

9
12 июля 2008 года
Lerkin
3.0K / / 25.03.2003
Если выравнивается по адресу, и компилятор от MS или Intel, то
[QUOTE=MSDN][FONT="Courier New"]__declspec( align( # ) ) declarator
[/FONT]
# is the alignment value. Valid entries are integer powers of two from 1 to 8192 (bytes), such as 2, 4, 8, 16, 32, or 64. declarator is the data that you are declaring as aligned.

__declspec(align(32)) struct Str1{
int a, b, c, d, e;
};
[/QUOTE]

Короче, тебе сюда.
36K
13 июля 2008 года
Alno
34 / / 23.06.2008
Цитата: zxc
Здраствуйте
не судите строго ибо только учусь
Такая проблема /на С /
нужно выделить память
и выровнять ее указатель на границу 4Кбайт

выделять ее я так понял можно ф-ей malloc,
а вот как потом этот указатель выравнивать
непонятно.

Подскажите кто чем


Первое, что пришло в голову. При работе с каким-то устройством встречал аналогичный код:

 
Код:
const int MAX_OFFSET = 4*1024;

char * realPtr = (char*) malloc( size + MAX_OFFSET );
char * usedPtr = realPtr + MAX_OFFSET - (realPtr % MAX_OFFSET);

Указатель usedPtr выровнен.
Только необходимо не забыть, что освобождать память необходимо по realPtr
255
14 июля 2008 года
Dart Bobr
1.4K / / 09.04.2004
Если под Win32 - можно сделать проще - создать MMF и использовать его. Насколько мне изветсно, система выделяет их выровнеными по-странично.
Вот, только зачем?
11K
16 июля 2008 года
zxc
11 / / 28.10.2005
извиняюсь за отсутствие,
были проблемы с инетом.

Спасибо всем


Цитата: Alno
Первое, что пришло в голову. При работе с каким-то устройством встречал аналогичный код:

 
Код:
const int MAX_OFFSET = 4*1024;

char * realPtr = (char*) malloc( size + MAX_OFFSET );
char * usedPtr = realPtr + MAX_OFFSET - (realPtr % MAX_OFFSET);

Указатель usedPtr выровнен.
Только необходимо не забыть, что освобождать память необходимо по realPtr



приблизительно так и хотел реализовать

еще раз спасибо

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог