Я новичок в C ++. Я в замешательстве и мне нужна помощь. < /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 смущен, и каким -то образом аритматика не удалась, но 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
-