簡體   English   中英

分配內存時內存使用不會增加

[英]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

我有幾個問題,因為此輸出沒有任何意義。

  1. 分配整數后,為什么虛擬/駐留內存都沒有更改?

  2. 操作系統如何將如此大量的內存分配給正在運行的進程。

當我運行代碼並檢查活動監視器時,我發現使用了304 kb的內存,但是該數量與通過編程獲得的虛擬/駐留內存使用量不同。

  1. 我的最終目標是能夠在分配數據時找到內存開銷,因此有一種方法可以做到這一點(即確定操作系統使用的字節並將其與分配的字節進行比較以找出差異是我目前在想的) )

感謝您的閱讀

C ++運行時通常在程序啟動時分配一個內存塊,然后在使用諸如new東西時將其打包到您的代碼中,並在調用delete時將其重新添加到該塊中。 因此,操作系統對單個new呼叫或delete呼叫一無所知。 這也是真正mallocfree在C(或C ++)

首先,您要測量頁數,而不是實際分配的內存。 其次,運行時預分配在啟動時分配幾個頁面。 如果您想觀察某些東西,則分配的不僅僅是一個int。 嘗試分配幾千個,您將觀察到一些變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM