Есть ли переносной способ определения (программно) размера страницы памяти с использованием кода C или C++?определение размера страницы памяти
ответ
С Boost
- довольно портативная библиотека, вы можете использовать функцию mapped_region::get_page_size()
для извлечения размера страницы памяти.
Что касается стандарта C++, это не дает такой возможности.
C ничего не знает о страницах памяти. На системах posix вы можете использовать long pagesize = sysconf(_SC_PAGE_SIZE);
Полностью зависит от платформы, какие диапазоны адресов сопоставляются с размерами страниц. Кроме того, размер страниц не является общесистемным. Вы можете выделить память из разных областей размера страницы в соответствии с вариантом использования. И вы даже можете иметь платформы без управления виртуальной памятью.
Итак, обработка кода в этом разделе должна быть специфичной для платформы.
Отсоедините между вашим объяснением и заключением; применение той же логики подсказывает нам, что определение размера указателя является специфичным для платформы. – kfsone
Я думаю, что эта функция помогает.
[DllImport ("kernel32.dll")] public static extern void GetSystemInfo ([MarshalAs (UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);
Вопрос говорит «C», «C++» и «Portable», и, кроме того, вам не удалось описать, как получить от этого размер страницы. – kfsone
Да, это зависит от платформы. В Linux есть sysconf(_SC_PAGESIZE)
, который также кажется POSIX. Типичная библиотека C реализует это с использованием вспомогательного вектора. Если по какой-то причине у вас нет библиотеки C или вспомогательный вектор можно определить размер страницы, как это:
size_t get_page_size(void)
{
size_t n;
char *p;
int u;
for (n = 1; n; n *= 2) {
p = mmap(0, n * 2, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
if (p == MAP_FAILED)
return -1;
u = munmap(p + n, n);
munmap(p, n * 2);
if (!u)
return n;
}
return -1;
}
Это также POSIX, я думаю. Он полагается на наличие свободной памяти, но ей нужны только две последовательные страницы. Это может быть полезно в некоторых (странных) обстоятельствах.
Через операционные системы нет.
В системах Linux:
#include <unistd.h>
long sz = sysconf (_SC_PAGESIZE);
- 1. Изменение размера страницы памяти
- 2. Определение размера таблицы таблицы
- 3. Определение размера страницы с помощью HttpModule
- 4. Определение размера печатной страницы в Excel VBA
- 5. Определение размера структуры
- 6. Определение размера C++ метод
- 7. Определение размера очереди
- 8. Динамическое определение размера изображения
- 9. Определение подходящего размера буфера
- 10. Определение размера динамически распределенного массива?
- 11. Определение сериализованного размера .NET-типа и неуправляемой эффективности памяти
- 12. определение размера многомерного массива
- 13. Определение размера кеша
- 14. Автоматическое определение размера UITableViewCell
- 15. Определение размера виджета wx.TextCtrl?
- 16. Определение размера временного шаблона
- 17. Определение размера массива
- 18. Определение размера чтения LocalSocket
- 19. Определение размера PCollection
- 20. Определение размера объединенной области
- 21. Javascript - определение размера файла
- 22. определение размера гистограммы
- 23. Определение размера PictureBox
- 24. Определение размера хранилища svn
- 25. Определение размера подстроки
- 26. Определение размера UITableViewCell
- 27. определение размера восстановленных окон
- 28. Определение размера музыкального файла
- 29. Определение размера страницы с расширением YSlow/Web Developer
- 30. iTextSharp, перерыв страницы в PDFPTable и определение размера тела
Нет, нет. – 2010-07-28 10:27:10
Нет, нет, потому что C и C++ существуют также для платформ без виртуальной памяти. – zvrba