определение размера страницы памяти - PullRequest
7 голосов
/ 28 июля 2010

Существует ли переносимый способ (программно) определения размера страницы памяти с использованием кода C или C ++?

Ответы [ 7 ]

11 голосов
/ 28 июля 2010

Поскольку Boost - довольно переносимая библиотека, вы можете использовать функцию mapped_region::get_page_size() для получения размера страницы памяти.

Что касается C ++ Standard, то такой возможности нет.

8 голосов
/ 28 июля 2010

C ничего не знает о страницах памяти.В системах posix вы можете использовать long pagesize = sysconf(_SC_PAGE_SIZE);

3 голосов
/ 21 июня 2018

Windows 10, Visual Studio 2017, C ++.Получить размер страницы в байтах.

int main()
{
    SYSTEM_INFO sysInfo;

    GetSystemInfo(&sysInfo);

    printf("%s %d\n\n", "PageSize[Bytes] :", sysInfo.dwPageSize);

    getchar();

    return 0;
}
3 голосов
/ 27 августа 2016

Да, это зависит от платформы. В 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, я думаю. Это зависит от наличия некоторой свободной памяти, но для этого нужны только две последовательные страницы. Это может быть полезно в некоторых (странных) обстоятельствах.

1 голос
/ 28 июля 2010

Это полностью зависит от платформы, какие диапазоны адресов сопоставлены с размерами страниц. Кроме того, размер страницы не является общесистемным. Вы можете выделить память из разных областей размера страницы в соответствии с вариантом использования. И вы даже можете иметь платформы без какого-либо управления виртуальной памятью.

Итак, обработка кода в этой теме должна зависеть от платформы.

0 голосов
/ 23 мая 2017

В операционных системах, нет.

В системах Linux:

#include <unistd.h>
long sz = sysconf (_SC_PAGESIZE);
0 голосов
/ 16 марта 2011

Я думаю, что эта функция помогает.
[DllImport ( "kernel32.dll")] public static extern void GetSystemInfo ([MarshalAs (UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);

...