Почему static_cast из void ** неверен в C ++? Возможно ли даже выполнить арифметику с помощью void ** [закрыто]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему static_cast из void ** неверен в C ++? Возможно ли даже выполнить арифметику с помощью void ** [закрыто]

Сообщение Anonymous »

Я новичок в 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»