Подскажите пжалста, у Рихтера написано, что в memory mapped files можно писать связанные списки и даже разделять их потом между процессами, используя MapViewOfFileEx, но как затолкать связанный список в такой файл, может кто знает?
Здравствуйте AlexUv, Вы писали:
AU> Подскажите пжалста, у Рихтера написано, что в memory mapped files можно писать связанные списки и даже разделять их потом между процессами, используя MapViewOfFileEx, но как затолкать связанный список в такой файл, может кто знает?
Да видимо обычно и заталкивать — как в нормальную память. MapViewOfFileEx ведь позволяет выставить один и тот же базовый адрес во всех процессах.
Здравствуйте AlexUv, Вы писали:
AU> Подскажите пжалста, у Рихтера написано, что в memory mapped files можно писать связанные списки и даже разделять их потом между процессами, используя MapViewOfFileEx, но как затолкать связанный список в такой файл, может кто знает?
Можно использовать смещения относительно начала файла
Завидую людям, которые могут себе позволить никуда не спешить.
Здравствуйте AlexUv, Вы писали:
AU> Подскажите пжалста, у Рихтера написано, что в memory mapped files можно писать связанные списки и даже разделять их потом между процессами, используя MapViewOfFileEx, но как затолкать связанный список в такой файл, может кто знает?
Наверное имелось в виду использование функций InitializeSListHead и ей подобных.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте AlexUv, Вы писали:
AU>AlexUv: Смещения от начала файла там же описаны как непродуктивные. Я имел в виду следущее: AU>struct _Node AU>{ AU>// содержание AU>};
AU>struct _ListNode AU>{ AU>_Node i; AU>_ListNode *prev,*next; AU>};
AU>Далее как обычно через new создаются эл-ты списка. Но каждый node создасться где-то в памяти. Можно ли такой список через mapped file разделить?
new переписать так, чтобы он память выделял в твоем memory mapped файле. Про одинаковые базовые адреса я уже раньше сказал.
Здравствуйте Lexey, Вы писали:
L>Здравствуйте AlexUv, Вы писали:
L>new переписать так, чтобы он память выделял в твоем memory mapped файле. Про одинаковые базовые адреса я уже раньше сказал.
Спасибо, мне у Страуструпа что-то похожее попадалось. Должен ли я при этом и смещение от начала файла задавать, например для первого node: new<0xffffff> sizeof(_ListNode), для второго new<0xffffff+sizeof(_ListNode)*1> sizeof(_ListNode) и т.п,?
Здравствуйте Lexey, Вы писали:
L>Здравствуйте AlexUv, Вы писали:
L>new переписать так, чтобы он память выделял в твоем memory mapped файле. Про одинаковые базовые адреса я уже раньше сказал.
Здесь возможны следующие проблемы:
— полагаю (возможно ошибаюсь), что может возникнуть ситуация, когда невозможно будет отобразить файл по базовому адресу во всех процессах
— перегрузка оператора new создаст необходимость написания менеджера памяти, если необходимо будет удалять элементы списка
Завидую людям, которые могут себе позволить никуда не спешить.
Здравствуйте AlexUv, Вы писали:
AU>Здравствуйте Lexey, Вы писали:
L>>Здравствуйте AlexUv, Вы писали:
L>>new переписать так, чтобы он память выделял в твоем memory mapped файле. Про одинаковые базовые адреса я уже раньше сказал.
AU>Спасибо, мне у Страуструпа что-то похожее попадалось. Должен ли я при этом и смещение от начала файла задавать, например для первого node: new<0xffffff> sizeof(_ListNode), для второго new<0xffffff+sizeof(_ListNode)*1> sizeof(_ListNode) и т.п,?
Если ты хочешь использовать Placement New, то придется задавать смещения. Если напишешь свой new, то всю логику выделения памяти и привязку к адресам можно засунуть в него.
Здравствуйте _Dinosaur, Вы писали:
D>Здесь возможны следующие проблемы: D>- полагаю (возможно ошибаюсь), что может возникнуть ситуация, когда невозможно будет отобразить файл по базовому адресу во всех процессах D>- перегрузка оператора new создаст необходимость написания менеджера памяти, если необходимо будет удалять элементы списка
Логично. Я нигде и не говорил, что проблем не будет.
По первому пункту все более-менее нормально, если процессы твои. Всегда можно зарезервировать область адресов, в которую ничего не попадет.
Второй пункт — это чисто дело техники.
Re[5]: Memory file mapping
От:
Аноним
Дата:
21.10.02 11:12
Оценка:
Здравствуйте Lexey, Вы писали:
L>Если ты хочешь использовать Placement New, то придется задавать смещения. Если напишешь свой new, то всю логику выделения памяти и привязку к адресам можно засунуть в него.
Погодь, так чем отличаются Placement New от моих собственных? Не придется же писать что-то вроде void *operator new(size_t size,LPVOID addr){return VirtualAlloc(addr,size);}??
Здравствуйте Аноним, Вы писали:
А>Здравствуйте Lexey, Вы писали:
L>>Если ты хочешь использовать Placement New, то придется задавать смещения. Если напишешь свой new, то всю логику выделения памяти и привязку к адресам можно засунуть в него. А>Погодь, так чем отличаются Placement New от моих собственных? Не придется же писать что-то вроде void *operator new(size_t size,LPVOID addr){return VirtualAlloc(addr,size);}??
То, что ты написал ранее — это placement new. Он не выделяет память, а только инициализирует объект в уже выделенной области. Соответсвенно, delete для такого объекта использовать тоже нельзя. Если у тебя есть контейнер, который сам выделяет память, то тебе придется переписывать его new. Если же ты сам можешь организовать создание объектов, то можешь обойтись и placement new.
BTW, а чем тебя пугает написание своего operator new?
Здравствуйте Lexey, Вы писали:
L>BTW, а чем тебя пугает написание своего operator new?
А чем я в собственном opertor new память выделяю? malloc,GlobalAlloc,VirtualAlloc? По моему представлению стандартный new выделяет память где-то в адресном пространстве процесса, или я не прав?
Здравствуйте AlexUv, Вы писали:
AU>Здравствуйте Lexey, Вы писали:
L>>BTW, а чем тебя пугает написание своего operator new? AU>А чем я в собственном opertor new память выделяю? malloc,GlobalAlloc,VirtualAlloc? По моему
А тебе там не нужно будет память выделять. Ты ведь ее уже выделил, замапив файл. Нужно будет хранить список свободных/занятых сегментов и по new выдвать из него блок, а по delete — освобождать.
>представлению стандартный new выделяет память где-то в адресном пространстве процесса, или я не прав?
Здравствуйте Lexey, Вы писали:
L>А тебе там не нужно будет память выделять. Ты ведь ее уже выделил, замапив файл. Нужно будет хранить список свободных/занятых сегментов и по new выдвать из него блок, а по delete — освобождать.
Спасибочки. То есть, если в стандартном списке у меня есть _ListNode *prev и _ListNode *next, то при хранении в mapped file они превращаются в DWORD prev и DWORD next, и вместо адреса там хранится некое смещение от предыдущего node? Я правильно понимаю?
Здравствуйте AlexUv, Вы писали:
AU>Спасибочки. То есть, если в стандартном списке у меня есть _ListNode *prev и _ListNode *next, то при хранении в mapped file они превращаются в DWORD prev и DWORD next, и вместо адреса там хранится некое смещение от предыдущего node? Я правильно понимаю?