Có cách nào để phát hiện (theo lập trình) kích thước trang bộ nhớ bằng mã C hoặc C++ không?phát hiện kích thước trang bộ nhớ
Trả lời
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.
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);
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ể.
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
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);
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
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ạ).
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);
- 1. .NET Kích thước bộ nhớ
- 2. Kích thước bộ nhớ cache tối đa
- 3. kích thước phân bổ bản đồ bộ nhớ lớn nhất?
- 4. Tại sao "Kích thước bộ nhớ được phép cạn kiệt"?
- 5. Phát hiện rò rỉ bộ nhớ
- 6. PyTables xử lý dữ liệu với kích thước lớn hơn nhiều lần kích thước bộ nhớ
- 7. kích thước bộ nhớ của cấu trúc dữ liệu Python
- 8. phép kích thước bộ nhớ của 268.435.456 byte kiệt sức
- 9. Kích thước tệp DLL trong bộ nhớ và kích thước trên đĩa cứng
- 10. Android: Chiến lược bộ nhớ cache hình ảnh và bộ nhớ cache kích thước
- 11. tối ưu hóa kích thước bộ nhớ trong java
- 12. Phát hiện hỗ trợ cho kích thước nền: che
- 13. Kích thước bộ nhớ của một ArrayList trong Java
- 14. Kích thước bộ nhớ cache Ehcache khi chạy
- 15. File trong kích thước bộ nhớ trong Java
- 16. Cách lấy kích thước đối tượng trong bộ nhớ?
- 17. Python: kích thước của chuỗi trong bộ nhớ
- 18. Kích thước của một byte trong bộ nhớ - Java
- 19. Lập trình có kích thước dòng bộ nhớ cache?
- 20. Cách tăng kích thước bộ nhớ cho phpmyadmin
- 21. jQuery: phát hiện một trình duyệt thay đổi kích thước
- 22. Phát hiện các kích thước cửa sổ chia
- 23. Phát hiện kích thước khối cho hạn ngạch trong Linux
- 24. Phát hiện bộ nhớ cache của trình duyệt theo jQuery
- 25. Tôi có thể thay đổi kích thước bộ nhớ chia sẻ Linux với shmctl không?
- 26. Phát hiện bộ nhớ tốt, rò rỉ và phát hiện lỗi cho Windows
- 27. Phát hiện thay đổi kích thước cửa sổ và thực hiện chức năng với jquery
- 28. Quy trình Kích thước bộ nhớ - Các bộ đếm khác nhau
- 29. Lỗi tràn bộ nhớ trong kiểm tra memory_limit được phát hiện - Không thể đặt giới hạn bộ nhớ quá 2gb?
- 30. Cấp phát bộ nhớ vượt quá. Phản hồi của máy chủ là: 4.3.1 Kích thước tin nhắn vượt quá kích thước tin nhắn tối đa cố định
Không, không có. –
Không có vì C và C++ cũng tồn tại đối với các nền tảng không có bộ nhớ ảo. – zvrba