Я пытаюсь создать свою собственную арену. На каждой странице я хочу: < /p>
[8byte] // pointer to page before
[8byte] // capacity used, act as offset
[8byte] // size of the data A // maybe stupid but this the only way i could think of to release without too much abstraction
[data A] // the real data, pointer point to
.. and so on
[8byte] // pointer to page after
< /code>
Итак, на каждой странице я хочу сохранить указатель на саму страницу. Если указатель-это просто голое число и «арифметизируемое», я должен быть в состоянии обмануть ОС, просто подготовив целое число правильного размера для указателя, верно?void ** beforePage = static_cast(heap::last_page_address);
void ** nextPage = static_cast(static_cast(beforePage) + internal::sysInfo.dwPageSize - sizeof(void *));
Если я не отбрасываю его в Byte *, возможно, при компиляции Clang смущен, и каким-то образом арифметика не удается. Но Кланг не позволяет мне разыграть.
Есть ли другой способ сделать арифметику с void ** ?void *
Core::ArenaMaster::Heap::
Alloc(u64 size){
if(!internal::initialized){
return nullptr;
}
u64 * used = static_cast(heap::last_page_address);
constexpr int POINTER_SIZE_PREVIOUS_AND_NEXT_PAGES = sizeof(void *) * 2;
u64 avaiable = internal::sysInfo.dwPageSize - * used - POINTER_SIZE_PREVIOUS_AND_NEXT_PAGES;
constexpr int DATA_LENGTH_SIZE = sizeof(u64);
u64 totalSize = size + DATA_LENGTH_SIZE;
if(avaiable < totalSize){
const float estimation = (float)(totalSize) / (float)(internal::sysInfo.dwPageSize);
int pageNeeded = (int)(estimation);
if (estimation > pageNeeded) {
pageNeeded += 1;
}
int created = 0;
bool failed = false;
void ** beforePage = static_cast(heap::last_page_address);
void ** nextPage = static_cast(static_cast(beforePage) + internal::sysInfo.dwPageSize - sizeof(void *));
while (created < pageNeeded) {
void * new_page_address = VirtualAlloc(
0,
internal::sysInfo.dwPageSize,
MEM_COMMIT | MEM_RESERVE ,
PAGE_READWRITE
);
if(!new_page_address){
failed = true;
break;
}
* nextPage = new_page_address;
* static_cast(new_page_address) = beforePage;
beforePage = static_cast(new_page_address);
nextPage = static_cast(static_cast(new_page_address) + internal::sysInfo.dwPageSize - sizeof(void *));
created++;
}
if (failed) {
while(created > 0){
//todo: revert back and virtual free
created --;
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... erform-ari
Почему static_cast из void ** неверен в C ++? Можно ли даже выполнить арифметику с помощью void **? [закрыто] ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Имитировать метод static void с параметрами с использованием Mockito и JUnit 5
Anonymous » » в форуме JAVA - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-