![](/img/trans.png)
[英]When creating a loop of new pointers, outputting the dereferenced pointer doesn't increase memory usage
[英]Memory usage doesn't increase when allocating memory
我想通過檢查操作系統的內存信息來找出C ++程序中某個進程使用的字節數。 我想這樣做的原因是在分配內存時發現內存分配中可能的開銷(由於空閑列表中的內存控制塊/節點等。)目前我在Mac上並且正在使用以下代碼:
#include <mach/mach.h>
#include <iostream>
int getResidentMemoryUsage() {
task_basic_info t_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
if (task_info(mach_task_self(), TASK_BASIC_INFO,
reinterpret_cast<task_info_t>(&t_info),
&t_info_count) == KERN_SUCCESS) {
return t_info.resident_size;
}
return -1;
}
int getVirtualMemoryUsage() {
task_basic_info t_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
if (task_info(mach_task_self(), TASK_BASIC_INFO,
reinterpret_cast<task_info_t>(&t_info),
&t_info_count) == KERN_SUCCESS) {
return t_info.virtual_size;
}
return -1;
}
int main(void) {
int virtualMemoryBefore = getVirtualMemoryUsage();
int residentMemoryBefore = getResidentMemoryUsage();
int* a = new int(5);
int virtualMemoryAfter = getVirtualMemoryUsage();
int residentMemoryAfter = getResidentMemoryUsage();
std::cout << virtualMemoryBefore << " " << virtualMemoryAfter << std::endl;
std::cout << residentMemoryBefore << " " << residentMemoryAfter << std::endl;
return 0;
}
運行此代碼時,我曾希望看到分配int后內存使用量增加了。 但是,當我運行上面的代碼時,我得到以下輸出:
75190272 75190272
819200 819200
我有幾個問題,因為此輸出沒有任何意義。
分配整數后,為什么虛擬/駐留內存都沒有更改?
操作系統如何將如此大量的內存分配給正在運行的進程。
當我運行代碼並檢查活動監視器時,我發現使用了304 kb的內存,但是該數量與通過編程獲得的虛擬/駐留內存使用量不同。
感謝您的閱讀
C ++運行時通常在程序啟動時分配一個內存塊,然后在使用諸如new
東西時將其打包到您的代碼中,並在調用delete
時將其重新添加到該塊中。 因此,操作系統對單個new
呼叫或delete
呼叫一無所知。 這也是真正malloc
和free
在C(或C ++)
首先,您要測量頁數,而不是實際分配的內存。 其次,運行時預分配在啟動時分配幾個頁面。 如果您想觀察某些東西,則分配的不僅僅是一個int。 嘗試分配幾千個,您將觀察到一些變化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.