Я пытаюсь создать свою собственную арену. На каждой странице я хочу: < /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++
Программы на C++. Форум разработчиков
1745512654
Anonymous
Я пытаюсь создать свою собственную арену. На каждой странице я хочу: < /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 --;
}
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79590274/why-is-static-cast-from-void-wrong-in-c-is-it-even-possible-to-perform-ari[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия