Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;对象内存管理_C++_Object_Memory Management - Fatal编程技术网

C++ c++;对象内存管理

C++ c++;对象内存管理,c++,object,memory-management,C++,Object,Memory Management,我试图了解随着对象数量的增加,内存是如何分配的。下面的测试程序创建了4亿个对象,其内存占用率约为23GB 为什么它会占用如此巨大的内存,而单个对象的大小只有16字节。理想情况下,我假设它应该是16字节乘以4亿 struct class1 { long long id; double value=0.0; class1(long long id) { this.id = id; } }; fo

我试图了解随着对象数量的增加,内存是如何分配的。下面的测试程序创建了4亿个对象,其内存占用率约为23GB

为什么它会占用如此巨大的内存,而单个对象的大小只有16字节。理想情况下,我假设它应该是16字节乘以4亿

    struct class1 {
        long long id;
        double value=0.0;
        class1(long long id) {
                this.id = id;
        }
};

for (int i=1;i<=400000000;i++) {
    class1 *t = new class1(i);
}
struct类1{
长id;
双值=0.0;
1级(长id){
this.id=id;
}
};

对于(int i=1;i每个分配都有一个“头”,其中包含关于块的额外信息。它肯定包括块的大小(因此“删除”知道要释放多少内存)、块是空闲的还是已分配的自由语句、数组中的元素数(如果是数组)等等

分配两个块,并减去它们的指针,您应该得到每个块占用的实际大小


然后,分配这些对象的大数组(比如100000个),然后只有一个,然后减去那些指针。这应该显示更接近16*100000的大小,因为该块只有一个头。

如果问题是如何使用相同数量的对象和减少的内存占用来编写程序,那么答案是重载new和delete运算符,并编写自己的分配器r,专门从大型池中分配16字节的块


通用分配器效率低下,因为它是通用的,而且在分配小对象时,它的写入速度很快,而不是为了节省内存。大多数程序不会因为数百万次的小分配而增加机器容量。

动态分配的块通常会将其大小取整(因此,您的可用大小实际上通常比新操作员要求的要大一些)并增加了一点管理数据开销。动态分配的数据通常也非常分散(缓存位置不好),这也是为什么在一个新的/malloc调用中分配尽可能多的资源是个好主意的另一个原因,填充,并查看编译器标志。当您进行大量小的分配时,内存空间往往会变得支离破碎。此外,您的内存分配器一次分配的内存块可能大于16字节(就像一次分配一个页面)。此外,您的类可能不仅仅是16字节-其中可能存在填充(+分配器开销)。好消息是,如果不写入内存,那么操作系统就不会使用物理页面(至少Linux内核不会)执行回分配,因此不会花费任何费用。当我尝试使用较少数量的对象(例如~40个对象)时,我看不到这个问题.令人费解的是,即使有额外的填充和开销,你认为它仍然占据了预期大小的3倍?我使用的是ubuntu。不确定切换操作系统是否会有任何不同?尝试使用优化标志-看看这是特定于分配器的。你不能只说“就是这样”没有命名您正在谈论的特定分配器。我只是泛指。具体情况可能会有所不同,但几乎所有分配器的工作方式都大致相同。