2010-07-28 42 views

Trả lời

9

Vì một thư viện khá dễ sử dụng, bạn có thể sử dụng chức năng mapped_region::get_page_size() để truy xuất kích thước trang bộ nhớ.

Đối với tiêu chuẩn C++, nó không có khả năng như vậy.

8

C không biết gì về trang bộ nhớ. Trên hệ thống posix, bạn có thể sử dụng long pagesize = sysconf(_SC_PAGE_SIZE);

1

Hoàn toàn phụ thuộc vào nền tảng mà dải địa chỉ được ánh xạ tới kích thước trang nào. Hơn nữa các trang không phải là toàn hệ thống. Bạn có thể cấp phát bộ nhớ từ các vùng kích thước trang khác nhau tùy theo trường hợp sử dụng. Và bạn thậm chí có thể có nền tảng mà không cần bất kỳ quản lý bộ nhớ ảo nào.

Vì vậy, việc xử lý mã chủ đề này phải là nền tảng cụ thể.

+0

Ngắt kết nối giữa lời giải thích của bạn và kết luận; áp dụng cùng một logic sẽ cho chúng ta biết rằng việc xác định kích thước của một con trỏ là nền tảng cụ thể. – kfsone

-3

Tôi nghĩ rằng chức năng này sẽ giúp ích.
[DllImport ("kernel32.dll")] public static extern void GetSystemInfo ([MarshalAs (UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);

+2

Câu hỏi nói 'C', 'C++' và 'di động' và trên hết là bạn đã quản lý thậm chí không mô tả cách chuyển từ đó sang kích thước trang. – kfsone

3

Có, đây là nền tảng cụ thể. Trên Linux có sysconf(_SC_PAGESIZE), cũng có vẻ là POSIX. Một thư viện C điển hình thực hiện việc này bằng cách sử dụng vector phụ trợ. Nếu vì lý do nào đó bạn không có thư viện C hoặc vectơ phụ trợ, bạn có thể xác định kích thước trang như sau:

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; 
} 

Đó cũng là POSIX, tôi nghĩ vậy. Nó dựa trên đó là một số bộ nhớ miễn phí, nhưng nó chỉ cần hai trang liên tiếp. Nó có thể hữu ích trong một số trường hợp (kỳ lạ).

0

Trên mọi hệ điều hành, không.

Trên các hệ thống Linux:

#include <unistd.h> 
long sz = sysconf (_SC_PAGESIZE); 
Các vấn đề liên quan