Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2] 3  Все   Вниз
  Печать  
Автор Тема: Пример задачи с интервью на работу.  (Прочитано 48107 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sss
Специалист

ru
Offline Offline

« Ответ #30 : 24-07-2003 08:19 » 

интересно, если добавить связанный список, сколько памяти потеряется ? У меня идея появилась, завтра (если не успею)  выложу.
Вы прняли, что у меня в примере стоит выравнивание на 17 ! И вообще ему по херу как выравнивать (только до байта).
Записан

while (8==8)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #31 : 24-07-2003 09:01 » 

Я вынужден тебе повторить - связный сисок не решение - в условии стояло следующее:

Решение должно отличаться от примера (приведен в первом сообщении) на несколько (few в оригинале) строк!!!!
Записан

А птичку нашу прошу не обижать!!!
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #32 : 24-07-2003 09:03 » 

RXL, ты куда пропал - задача так и не решена - нельзя избыточно + 15 решать задачу таким выравниванием.
Записан

А птичку нашу прошу не обижать!!!
sss
Специалист

ru
Offline Offline

« Ответ #33 : 24-07-2003 09:04 » 

Цитата: Гром
Я вынужден тебе повторить - связный сисок не решение - в условии стояло следующее:

Решение должно отличаться от примера (приведен в первом сообщении) на несколько (few в оригинале) строк!!!!


Да это я так, гоню. А про сиски это ничего  Жжешь.
Записан

while (8==8)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #34 : 24-07-2003 09:05 » 

Улыбаюсь
Записан

А птичку нашу прошу не обижать!!!
sss
Специалист

ru
Offline Offline

« Ответ #35 : 24-07-2003 09:07 » 

А выделить дамп и в нем работать можно?
Записан

while (8==8)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #36 : 24-07-2003 09:12 » 

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

А птичку нашу прошу не обижать!!!
sss
Специалист

ru
Offline Offline

« Ответ #37 : 24-07-2003 09:20 » 

Все таки, sizeof(*void) можно использовать или нет ?
А если организовать как страничный механизм ?
Записан

while (8==8)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #38 : 24-07-2003 11:19 » 

Нет нельзя - проверяли - не работает.

Механизм такой - при запросе sizeof у типизированного указателя типа
Код:
char * a;
void * p;

p = malloc(10);

a = p;

sizeof(*a);

Результат будет 1 - т.е. 1 пункт первый на который указывает указатель.

При объявлении
Код:
char a[10];
void * p;

p = malloc(10);

a = p;

sizeof(*a);

Возврат идет = 10. Длина массива данных.

sizeof (p) - = 4 всегда в 32 битных системах - размер самого указателя 4 байта.
« Последнее редактирование: 19-11-2007 07:02 от RXL » Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #39 : 24-07-2003 12:03 » 

Цитата: sss
Короче вот окончательный вариант. Неужели трудно понять идею?
Вот это мы сейчас и выясним...
Некоторые коментарии:
Цитата

...
const char   G = 17; /* опечатка? 16 ! */

#ifdef _MAC
... /* То ли бред, то ли я не понимаю. Объясни, пожалуйста, этот участок подробно. */
#else

void *malloc_aligned(size_t size)
{
   unsigned long p = (unsigned long) malloc(size + G);
   char ofs =(char)(G - p%G);
   if (ofs == 0) ofs = G; /* Это лишняя строка. Согласно утверждению  G>p%G , ofs ни когда не равно 0! */
...


Цитата
Единственное что остается - это использовать то, что malloc ВСЕГДА выделяет объем кратный 8. Будем это использовать, или нет ?

Вот-вот!

2Гром:
В условии ни чего не сказано о кратности адресов, возвращаемых malloc()?
Мне кажется, что не достаточно четко поставлена задача.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
sss
Специалист

ru
Offline Offline

« Ответ #40 : 25-07-2003 02:08 » 

Код:
// Таблица корректировки (TCP) 65535 указателей, при условии
// упорядоченной области памяти = 1048560 B.
// можно конечно в 2 раза меньше тратить на TCP , но все равно посяково.
// Зато быстро ! Но работает только при G%2 = 0 & G <= 16
// PS: Так же мы можем убрать все за юзера.
const int maxtcp = 0x0FFFF;
char  TCP[maxtcp + 1] ;

void *malloc_aligned(size_t size)
{
// все та же хрень + TCP. Вообще не понимаю, как можно получить
// количество байт для выравнивания не зная указатель ?
// Вот в этом месте хотел бросить
unsigned long p = (unsigned long) malloc(size + G);
unsigned int idx = ((p + p % G) >> 1) & maxtcp;  
TCP[idx] = (char) (p % G);
printf("alloc idx = %04X real ptr = %08X TCP = %02d", idx, p, TCP[idx]);
unsigned long ps = p%G;
return (void*) (p + (p%G));
}

void free_aligned(void *p)
{
unsigned int idx = ((unsigned long) p >> 1) & maxtcp;
void* ps = (void*) ((unsigned long) p - (char) TCP[idx]);
printf("free  idx = %04X real ptr = %08X TCP = %02d user ptr = %08X \n", idx, (unsigned long) ps, TCP[idx], (unsigned long) p);
free(ps);
}

int main(int argc, char* argv[])
{
 const char max = 100;
 void* p[max];
 int i;
 for (i = 0; i < max; i++)
{
printf("(%02d) ", i);
p[i] = malloc_aligned((rand() & 0x0FFE) + 1);
printf(" user ptr = %08X \n", (unsigned long) p[i]);
}
for (i = 0; i < max; i++)
{
printf("(%02d) ", i);
  free_aligned(p[i]);
}

 return 0;
}
« Последнее редактирование: 19-11-2007 07:02 от RXL » Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #41 : 25-07-2003 02:16 » 

для RXL

const char G = 17; /* опечатка? 16 ! */

нет, здесь просто выравнивание на 17. Я уже говорил, что выравнивание на любую гранулу. Просто забыл исправить.

if (ofs == 0) ofs = G; /* Это лишняя строка. Согласно утверждению G>p%G , ofs ни когда не равно 0!


16%16 = 0. Самый крайний случай. Например реальный р выделен кратным 16. Как мы это узнаем во free  :?:


ifdef _MAC
... /* То ли бред, то ли я не понимаю. Объясни, пожалуйста, этот участок подробно. */

Ну может и бред, я это про другой порядок байт. Может что и напутал  Ага
Записан

while (8==8)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #42 : 25-07-2003 07:29 » 

Цитата: sss

16%16 = 0. Самый крайний случай. Например реальный р выделен кратным 16. Как мы это узнаем во free  :?:
Да, об таком случае я не подумал. Но трудно найти операционку, в которой младшие адреса предоставляются в свободный доступ.
Цитата

Ну может и бред, я это про другой порядок байт. Может что и напутал  Ага
Порядок байт в слове имеет смысл, если ты оперируешь более чем байтами. Здесь же работа с байтами.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #43 : 25-07-2003 07:41 » 

Да уж - я уверяюсь в мысли, что задача хоть и имеет решение - но такое не решается в реале.
Т.е. теоретически есть возможности.
1. Создать и хранить связный список сдвигов и адресов.
2. Делать созранение в избыточной памяти размера сдвига ПЕРЕД записью указателя.

Это пока минимум.
Дальше идей у меня пока нет.
Записан

А птичку нашу прошу не обижать!!!
sss
Специалист

ru
Offline Offline

« Ответ #44 : 25-07-2003 08:11 » 

А вы мой пример запускали? Посмотрите на TCP[idx] повнимательней !
В любом случае только два значения 0 или 8 !
Так что поиграем ещё? Гром, давай не уставай !
Записан

while (8==8)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #45 : 25-07-2003 08:13 » 

Я! Да никогда...  Ага Я на неделе звякну и потребую ответа с фирмы...
Потом мы его проверим и составим убийственныйотчет, но это  понедельник, а пока сами.
Записан

А птичку нашу прошу не обижать!!!
sss
Специалист

ru
Offline Offline

« Ответ #46 : 25-07-2003 09:07 » 

Цитата: Гром
Я! Да никогда...  Ага


OK  :twisted:
Записан

while (8==8)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #47 : 25-07-2003 09:47 » 

2sss:
Неправильная у тебя программка...
Много синтаксических ошибок - на которые, видимо, VC закрывает глаза (или warning level не тот).
Попробуй запросить не 100, а больше блоков. У меня на 234-м уже получилось повторное использование индекса. Обдумай этот момент - логика получения idx неверная.

Вот подправил и вставил запоминание предыдущего адреса, использовавшего этот индекс.
Программа завершается segmentation fault, но это уже нормально... Отлично
Код:
#include <stdio.h>
#include <stdlib.h>

#define maxtcp 0x0FFFF
char TCP[maxtcp + 1];
unsigned long TCP_r[maxtcp + 1];

#define G 16

void *malloc_aligned(size_t size) {
    unsigned long p = (unsigned long) malloc(size + G);
    unsigned int idx = ((p + p % G) >> 1) & maxtcp;
    unsigned long ps;
    if(TCP_r[idx]) printf("DOUBLE USE: (%08lx)\n",TCP_r[idx]);
    TCP_r[idx]=p;
    TCP[idx] = (char) (p % G);
    printf("alloc_idx=%04X real_ptr=%08lX TCP=%02d", idx, p, TCP[idx]);
    ps = p%G;
    return (void*) (p + (p%G));
    }

void free_aligned(void *p) {
    unsigned int idx = ((unsigned long) p >> 1) & maxtcp;
    void* ps = (void*) ((unsigned long) p - (char) TCP[idx]);
    printf("free_idx=%04X real_ptr=%08lX TCP=%02d user_ptr=%08lX\n", idx, (unsigned long) ps, TCP[idx], (unsigned long) p);
    free(ps);
    }

#define max 1000

int main(int argc, char* argv[]) {
    void* p[max];
    int i;
    for (i = 0; i < max; i++) {
printf("(%02d) ", i);
p[i] = malloc_aligned((rand() & 0x0FFE) + 1);
printf(" user_ptr=%08lX\n", (unsigned long) p[i]);
}
    for (i = 0; i < max; i++) {
printf("(%02d) ", i);
free_aligned(p[i]);
}
    return 0;
    }
« Последнее редактирование: 19-11-2007 07:03 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #48 : 25-07-2003 10:05 » 

Если честно - оч ем вы - причем тут TCP Не понял
Вы пытаетесь написать управление пулом памяти для socket указателей???
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #49 : 25-07-2003 10:09 » 

Отлично Не совсем.
"TCP" - это у него на русско-английском наречии "Таблица Корректировки Поинтеров".
Он решил запоминать смещение выравнивания в массиве, а индекс массива вычисляет из исходного указателя.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #50 : 25-07-2003 10:53 » 

Тю, тфу ты... Улыбаюсь Сразу заметно что в Российском сленге я не очень  Отлично
Ясно...
Записан

А птичку нашу прошу не обижать!!!
grozny
Гость
« Ответ #51 : 28-07-2003 22:16 » 

вот елы-палы, как долго не заходишь, всегда самое интересное пропускаешь  Отлично

короче, у нас тоже есть любитель спрашивать про aligned malloc  Отлично

эээ, я пока по существу воздержусь, надо почитать ваши решения повнимательнее.

Насчет размеров нетипизированного указателя:

void* p;
printf("'void' is 1 byte: %s",sizeof(*p)==1?"yes":"no");
printf("void* increments in 1 byte: %s", ((unsigned int)(p+1)==(unsigned int)((unsigned char*)p+1))?"yes":"no" );

такая штука не только спокойно скомпилируется, но и напечатает 'void' is 1 byte: yes' (что как бы не есть правильно, но тем не менее). Если память меня окончательно не покинула, то в MSVC 4.2 именно так. Что означает, что в таком случае void* эквивалентен unsigned char*.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #52 : 29-07-2003 00:14 » 

Цитата: RXL
2sss:
Неправильная у тебя программка...
.... У меня на 234-м уже получилось повторное использование индекса. Обдумай этот момент - логика получения idx неверная.


Дык конечно, память нам Windows выделяет. И наченает сразу с ахиренных. Ну а так, конечно же ты прав  8) . Кстати если пользоваться гранулой 8 байт для malloc можно увеличить таблицу в 8 раз  Ага. А так мой код это эмуляция страничного механизма. Главное скорость.
Записан

while (8==8)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #53 : 29-07-2003 08:16 » 

2grozny:
Цитата
Что означает, что в таком случае void* эквивалентен unsigned char*
Не стоит на это расчитывать - может статься, что в один прекрасный день MS сделает в VC sizeof(void)==8 и все некоректные программы перестанут собираться. Отлично

2sss:
Вот посмотри на такой вариант:
Код:
struct s_entry {
  void *pa;
  void *pr;
  struct s_entry *next;
  };

static struct s_entry *hash[256];

void add_entry(void *pa,void *pr) {
  int key;
  struct s_entry *se;

  key=(pa^(pa>>8)^(pa>>16)^(pa>>24))&0xff; /* hash ф-ия, желательно, должна давать хорошее распеределение по всем элементам */
  se=(struct s_entry*)malloc(sizeof(struct s_entry));
  se->pa=pa;
  se->pr=pr;
  se->next=hash[key];
  hash[key]=se;
  }
Саму работу с памятью, дабы не нагромождать, я опустил. Так же не изобразил поиск и удаление - все это, я думаю, не сложно домыслить.
« Последнее редактирование: 19-11-2007 07:03 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
grozny
Гость
« Ответ #54 : 29-07-2003 20:10 » 

2 RXL:

Цитата

Не стоит на это расчитывать - может статься, что в один прекрасный день MS сделает в VC sizeof(void)==8 и все некоректные программы перестанут собираться

да я-то не рассчитываю, я попытался объяснить странную логику этих перцев Улыбаюсь

В общем, почитал - по сути вы все правильно рассуждаете.

А насчёт поиска конкретной отгадки - ну мне кажется вы слишком увлеклись *правильным* решением. Управление памятью - большая наука, как ни странно звучит, а вы тут вкратце взялись воспроизвести 2-й том Кнута Улыбаюсь.

Давайте вернёмся к условию задачи:

#include "os.h"
int G_align;
void * malloc_aligmen(int sz)
{
p = malloc(sz);

if ((unsigned long)p)%2)
G_align=1;
else
G_align=0;

return p+G_align;
}


void free_aligmen(void * p)
{

free (p-G_align);

}

Недостатки примера описаны так:

1. Он возвращает размер памяти меньше запрошенного.

2. Он не может быть задействован без free т.е. однократный только парами malloc+free работает

3. Выравнивание в примере по 2. Надо по 16.

Кстати, вопрос к Грому: р не описан. Так и было? Я далее предполагаю, что это void*.

Итак, анализируя постановку задачи (особенно "недостатки" ) мы увидим, что есть масса невных допущений.
0. void* p;
1. (sizeof(void)==1) истинно.
2. (p+1==(unsigned long)p+1) истинно
3. (p-1==(unsigned long)p-1) истинно
4. sizeof(void*)==(unsigned long)
5. Юзер никогда не обратится к последнему элементу p в случае нечётного адреса р.

Теперь о комментариях Грома к вопросам:
а. выравнивание таки есть. Следует из предположений 1-4
б. мы обделаемся не при "любой работе", а только в случае 5.

чёрт, работа поджимает, напишите, стоит ли продолжать, я вечерком продолжу, если интересно...

Кстати, в подготовке к интервью (три года назад, с тех пор чё-то получе могло выйти) мне здорово помогла книжка Jon Bentley. Programming Pearls, 2nd edition.

Вчера спалил блок питания домашнего компа  Ха-ха-ха , хорошо, запасной был...
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #55 : 29-07-2003 21:36 » 

Цитата

0. void* p;
1. (sizeof(void)==1) истинно.
2. (p+1==(unsigned long)p+1) истинно
3. (p-1==(unsigned long)p-1) истинно
4. sizeof(void*)==(unsigned long)
5. Юзер никогда не обратится к последнему элементу p в случае нечётного адреса р.


0 - уже писал - что пропустил - это действительно void * p;
1 - Да
2 - 3. Никогда не пропустит компилятор - если не сделать приведенный в цитате кастинг... Отсюда не следует никакой драмы, однако предлагать неверно компилируюмую задачу считаю некорректным.
4 Да.
5. Это не работает в связи с пунктом 2-3.

Кстати насчет допущений - не указано было, какой ОС будет использован код.
А это иногда играет решающую роль в алгоритме.

Полагая, что решение обязано быть - мы попытались не решать общую задачу, а оттолкнувшись от условия добавить (few) несколько сторок к примеру - получить выравнивание по 16 и с возможностью нормальной работы в понимании автора примера.

В чистом виде это не получается.
Мое предположение что при выравнивании использовать можно избыточность + 16 от старта всегда, при невыравненном адресе дабы обычным делением можно было бы определить смещение назад во free успеха у принимающего товарища не имела, как и попытка хранить смещение в первых битах памяти - свободных после сдвига. (условие избыточности во втором случае тоже есть).

Вот такие пироги.
Кстати - блок пистания спалить мне не удавалось еще ни разу, что было то?
Записан

А птичку нашу прошу не обижать!!!
grozny
Гость
« Ответ #56 : 30-07-2003 02:01 » 

Кстати, офсет (0-15) можно паковать в 4 бита. Так что если у тебя уже есть 32-бит переменная, то её хватит на 8 одновременных маллока. С минимальными правками, следуя идеологии авторов. Ну и

if ((unsigned long)p)%2)
G_align=1;
else
G_align=0;

заменяется на

G_align=(unsigned long)p&1;

А для 2^N бит на

G_align=(unsigned long)p&((1<<N)-1);

вариант с упаковкой напишу в след. серии Улыбаюсь . Есть у меня мысля, как хранить количество аллокаций не тратя переменной...

--------------------------------------
блок питания: да похоже предохранитель выбило в блоке - ковырялся в потрохах на ходу (решил платку видео прикрутить наконец Улыбаюсь и локтем довольно убедительно въехал в кнопку "юзер" на логитековской кейборде. После чего раздался тихий хлопок, запахло изоляцией и всё умерло, питания на мамке не стало, я щупал авометром и лампочка не горит  Вот такой я вот . Блок 350 ватт Энермакс - перегрузки быть не должно. Кстати, кейборда умерла, счас понесу сдавать обратно - завтра ровно 30 дней как купил Улыбаюсь. По идее кнопочка "юзер" должна погружать компутер в сон, похоже замкнуло там линию. Хреновато сделано - она чёрная и на краю, я и до того пару раз нажимал совершенно случайно. А блок у меня уже год, гарантия типа пожизненная от производителя, да посылать-то надо на свои, нету смысла, счас полезу посмотрю чё там внутри.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #57 : 30-07-2003 04:58 » 

Цитата: RXL
2sss:
Вот посмотри на такой вариант ...


Я пока занят очень  :!: Интерес не теряю
Записан

while (8==8)
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #58 : 30-07-2003 06:54 » 

grozny, ты прав что хватит - только вот проблемка - ты не можешь знать соответствия указателя пришедшего во free к той записи которую ты сделал, в G_align.
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #59 : 30-07-2003 09:21 » 

Я думаю, что следующие пункты можно считать "истиной":
1) информацию о сдвиге хранить нужно в любом случае, да же если malloc() выдаст уже выравненный адрес - во free() поступают только выравненные указатели и понять кто кем был в "прошлой жиэни" никак нельзя;
2) 4 бита - все равно не меньше байта  Ага ;
3) смещение, для выравнивания на 16, будет 0..15;
4) возвращать следует блок, в который можно законно и безопасно писать и читать в смещении 0..(size-1) - пользователь наших ф-ий не должен замарачиваться из-за нащих извращений Ага .

Исходя из пункта 3 следует: pa=(15+(unsigned long)pr)&-16 . Замечу, что не +16 - так займется лишний байт, который к выравниванию не имеет ни какого отношения - он расширит блок на конце.

Теперь процитирую Грома:
G_align=((unsigned long)p %16); /* ==(unsigned long)p&-16 */
returm p+G_align;
Это выравняет p только в случае, что исходное значение выравнено на 8 - в остальных случаях будет полный бардак! Согласно экспирементам, в win32 и в linux (все на ia32) malloc() выравнивает на 8, но в задаче нет такого условия. И к тому же, выражение p+G_align нелогично - лучше было бы написать p+16-G_align. И, к тому же, в этом варианте решения достаточно malloc(size+8 ), а не +16.

И так, для выравнивания нужно от 0 до 15 байт - конечно берем большее. Где-то нужно хранить смещение: в конце блока нельзя(free() не знает размер), остается только вначале блока или вне его. Остановимся на варианте "в начале блока". Согласно пунктам 1, 2 и 4 нужно еще хотя бы один байт в начале блока. Выравнивание даст 0..15 "лишних" байт в начале блока - "0" тут не подходит... Значит нужно еще 16 байт, да бы не потерять выравнивания: pa=(15+16+(unsigned long)p)&-16 .
Ну и, конечно, pr=malloc(size+15+16);
Как хранить смещение - дело вкуса. Т.к., в нашем распоряжении целых 16 байт, то я решил убрать лишние вычисления и хранить pr целиком.

Тут я, как вы поняли, еще раз обосновал свой первый вариант решения. Отлично

Что касается хранения смещения (или pr) вне блока, то это не подходит по условию "few строк"...

Тупик какой-то...
Нужны свежие идеи.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: 1 [2] 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines