是否有一种可移植的方法来使用C或C ++代码(以编程方式)检测内存页面大小?
由于Boost
是一个非常可移植的库,您可以使用mapped_region::get_page_size()
函数来检索内存页面大小。
至于C ++标准,它没有提供这种可能性。
C对内存页面一无所知。 在posix系统上,你可以使用long pagesize = sysconf(_SC_PAGE_SIZE);
是的,这是特定于平台的。 在Linux上有sysconf(_SC_PAGESIZE)
,它似乎也是POSIX。 典型的C库使用辅助向量实现此function。 如果由于某种原因你没有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。 它依赖于有一些空闲内存,但它只需要两个连续的页面。 它可能在某些(奇怪的)情况下有用。
它完全取决于平台,地址范围映射到哪些页面大小。 此外,页面大小不是系统范围的。 您可以根据用例从不同的页面大小区域分配内存。 而且你甚至可以拥有没有任何虚拟内存管理的平台。
因此,处理此主题的代码必须是特定于平台的。
Windows 10,Visual Studio 2017,C ++。 获取页面大小(以字节为单位)
int main() { SYSTEM_INFO sysInfo; GetSystemInfo(&sysInfo); printf("%s %dnn", "PageSize[Bytes] :", sysInfo.dwPageSize); getchar(); return 0; }
在整个操作系统中,没有。
在Linux系统上:
#include long sz = sysconf (_SC_PAGESIZE);
我认为这个function有帮助。
[DllImport(“kernel32.dll”)] public static extern void GetSystemInfo([MarshalAs(UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);
以上就是c/c++开发分享检测内存页面大小相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560019.html