LINUX.ORG.RU

[C] Структурирование выделенной памяти.

 


0

0

Здравствуй ЛОР!

У меня нубский вопрос по С. Допустим я выделил 10K shared memory функцией shmget. Получил указатель на начало памяти shmat. Как, например, в рамках выделенной памяти можно создать связанный список?


YourLinkedList *head = (YourLinkedList *) PointerToYourAllocatedMemory;
yoghurt ★★★★★
()

Си это язык с очень не строгими типами. Ты можешь интерпретировать память как объекты любого типа, просто приводя указатели. Но ты должен понимать, что бить будут тебя!

catap ★★★★★
()

Строй обычный список, выделяя объекты в этом куске памяти. Но вместо реальных адресов (указателей на следующий элемент, в частности) храни смещение относительно начала куска памяти. Будет работать во всех процессах, независимо от того, куда приаттачился кусок памяти. Не будет работать, если один процесс 32-битный, а другой - 64-битный. Можно и на этот случай придумать свой выпендрёж, если надо.

const86 ★★★★★
()
Ответ на: комментарий от catap

> ...Но ты должен понимать, что бить будут тебя!

^^like! :)

Cy6erBr4in ★★★
()

даже в си, наверно, лучше сделать свой malloc, который будет выделять из 10K shared memory; в плюсах этот вопрос решается перегрузкой оператора new для класса списка

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от anonymous

Ну например потому, что списков можно хранить в одном разделяемом куске много в перемешку, а массивы только последовательно, то есть прощай произвольная длина массива!

ixrws ★★★
()
Ответ на: комментарий от ixrws

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

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

OxiD ★★★★
()
Ответ на: комментарий от www_linux_org_ru

>в плюсах этот вопрос решается перегрузкой оператора new для класса списка

Не решается. placement new внутри интересующего куска любой дурак сделает, но вместо указателей придётся хранить смещения, насколько я знаю существующие списки общего назначения ни в плюсах ни в си на такое не рассчитаны, они будут хранить указатели. Т.е. список полюбому придётся писать свой с ptrdiff_t вместо указателей. Или даже тупо int16_t. И как-то решать вопрос с менеджментом памяти в этом отдельно взятом куске, т.е. свой malloc и free и вести списки свободных блоков.

legolegs ★★★★★
()
Ответ на: комментарий от ixrws

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

xydo ★★
()

(теоретически) можно конечно попробовать

struct fslist;
struct fslist {
  register struct fslist *next asm("fs");
  size_t size;
  unsigned char data[FSLIST_PAYLOAD];
};

register struct fslist *fstop asm("fs")=0L;

засунуть в регистр FS полученный от shmget сегмент и возможно будет щастье.

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.