跟踪c+中的相对内存使用情况+;17 我试图理解C++中内存管理的复杂性,以便教给我的学生。因为最好的学习方法是通过尝试,所以我想尝试几个代码片段,看看它们如何影响内存使用。例如,为了了解唯一指针的工作原理,我想尝试以下方法: #include <memory> using namespace std; int main() { { // print memory - should be X auto i = make_unique<int>(); // print memory - should be X-4 } // print memory - should be X } #包括 使用名称空间std; int main() { { //打印内存-应为X 自动i=使_唯一(); //打印内存-应为X-4 } //打印内存-应为X }

跟踪c+中的相对内存使用情况+;17 我试图理解C++中内存管理的复杂性,以便教给我的学生。因为最好的学习方法是通过尝试,所以我想尝试几个代码片段,看看它们如何影响内存使用。例如,为了了解唯一指针的工作原理,我想尝试以下方法: #include <memory> using namespace std; int main() { { // print memory - should be X auto i = make_unique<int>(); // print memory - should be X-4 } // print memory - should be X } #包括 使用名称空间std; int main() { { //打印内存-应为X 自动i=使_唯一(); //打印内存-应为X-4 } //打印内存-应为X },c++,memory,c++17,C++,Memory,C++17,我写的评论是基于我目前的理解,这当然可能是错误的;我想检查一下我是否理解正确。我的问题是:我可以写什么来代替“打印内存” 我发现了几个明显相似的问题,比如:和。然而,那里的答案非常复杂,并且依赖于平台。我的需求要简单得多:我不需要程序的绝对内存消耗(也就是说,我不需要X来精确)。我所需要的只是一个相对的测量,它会告诉我我的行为是如何影响内存消耗的。 对于这种需求,有没有更简单的解决方案?你能不能让unique\u ptr的结构比整数大,以Kbs代替字节?然后,您可以在任务管理器(或您的操作系统使

我写的评论是基于我目前的理解,这当然可能是错误的;我想检查一下我是否理解正确。我的问题是:我可以写什么来代替“打印内存”

我发现了几个明显相似的问题,比如:和。然而,那里的答案非常复杂,并且依赖于平台。我的需求要简单得多:我不需要程序的绝对内存消耗(也就是说,我不需要X来精确)。我所需要的只是一个相对的测量,它会告诉我我的行为是如何影响内存消耗的。
对于这种需求,有没有更简单的解决方案?

你能不能让unique\u ptr的结构比整数大,以Kbs代替字节?然后,您可以在任务管理器(或您的操作系统使用的任何工具)中检查进程内存,让您的学生一步一步地阅读代码。

难道您不能让unique\u ptr保持大于整数的结构,保留Kbs而不是字节吗?然后,也许只需检查任务管理器中的进程内存(或您的操作系统使用的任何程序),您就可以向您的学生逐步演示代码。

根据Jorge Y的答案,我创建了以下程序。它不是最优的,因为(a)它只在Linux上工作,(b)它需要我在程序控制台之外打开一个终端窗口来跟踪内存。但是,至少出于演示目的,它是好的

#include <iostream>
#include <memory>
#include <vector>
#include <thread>
#include <chrono>
using namespace std;

#define USE_UNIQUE_PTR

constexpr int SIZE=1000*1000*1000;
struct Large {
    char x[SIZE];
};

int main() {
    cout << "Before braces" << endl;
    this_thread::sleep_for(chrono::milliseconds(5000));
    // On Linux, run:    cat /proc/meminfo |grep MemFree
    // Available memory is X
    {
        #ifdef USE_UNIQUE_PTR
        auto p = make_unique<Large>();
        #else
        auto p = new Large();
        #endif
        cout << "Inside braces" << endl;
        p->x[0] = 5;
        cout << p->x[0] << endl;
        this_thread::sleep_for(chrono::milliseconds(5000));
        // On Linux, run:    cat /proc/meminfo |grep MemFree
        // Available memory should be X-SIZE
    }
    cout << "Outside braces" << endl;
    this_thread::sleep_for(chrono::milliseconds(5000));
    // On Linux, run:    cat /proc/meminfo |grep MemFree
    // Available memory should be X if USE_UNIQUE_PTR is defined, X-SIZE if it is undefined.
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#定义使用\u唯一\u PTR
constexpr int SIZE=1000*1000*1000;
结构大{
字符x[大小];
};
int main(){

按照Jorge Y的回答,我创建了以下程序。它不是最优的,因为(a)它只在Linux上工作,(b)它需要我在程序控制台之外打开一个终端窗口来跟踪内存。但是,至少它对于演示来说是好的

#include <iostream>
#include <memory>
#include <vector>
#include <thread>
#include <chrono>
using namespace std;

#define USE_UNIQUE_PTR

constexpr int SIZE=1000*1000*1000;
struct Large {
    char x[SIZE];
};

int main() {
    cout << "Before braces" << endl;
    this_thread::sleep_for(chrono::milliseconds(5000));
    // On Linux, run:    cat /proc/meminfo |grep MemFree
    // Available memory is X
    {
        #ifdef USE_UNIQUE_PTR
        auto p = make_unique<Large>();
        #else
        auto p = new Large();
        #endif
        cout << "Inside braces" << endl;
        p->x[0] = 5;
        cout << p->x[0] << endl;
        this_thread::sleep_for(chrono::milliseconds(5000));
        // On Linux, run:    cat /proc/meminfo |grep MemFree
        // Available memory should be X-SIZE
    }
    cout << "Outside braces" << endl;
    this_thread::sleep_for(chrono::milliseconds(5000));
    // On Linux, run:    cat /proc/meminfo |grep MemFree
    // Available memory should be X if USE_UNIQUE_PTR is defined, X-SIZE if it is undefined.
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#定义使用\u唯一\u PTR
constexpr int SIZE=1000*1000*1000;
结构大{
字符x[大小];
};
int main(){

你可以编写自己的分配器/重载
new
@appleapple,它不会处理堆栈上分配的内存……我想你可以包装这个“复杂的”方法转换为方法/库。@user202729是的,但根据OP写的内容,我认为他对动态内存更感兴趣。顺便说一句,对于堆栈内存,通常对象的地址就足够了。为什么不在内存探查器下运行它呢?您可以编写自己的分配器/重载
new
@appleapple,它不会处理在e stack…我想你可以把“复合体”包装起来方法转换为方法/库。@user202729是的,但根据OP写的内容,我认为他对动态内存更感兴趣。顺便说一句,对于堆栈内存,通常对象的地址就足够了。为什么不在内存探查器下运行它呢?我很高兴这个解决方法对您有效。在Windows中,您可以使用任务管理器实现同样的目的。在询问管理器您有“进程”选项卡,其中一个可用列是进程使用的内存。这应该显示程序中发生的内存更改。我很高兴解决方法对您有效。在Windows中,您可以将任务管理器用于相同目的。在任务管理器中,您有“进程”选项卡,其中一个可用列是进程使用的内存。这应该显示程序中发生的内存更改。