【发布时间】:2015-12-08 22:08:07
【问题描述】:
我在理解以下代码的内存使用方面有问题:
typedef struct list{
uint64_t*** entrys;
int dimension;
uint64_t len;
} list;
void init_list(list * t, uint64_t dim, uint64_t length, int amount_reg)
{
t->dimension = dim;
t->len=length;
t->entrys = (uint64_t ***) malloc(sizeof(uint64_t**)*length);
uint64_t i;
for(i=0;i<length;i++)
{
t->entrys[i] = (uint64_t **) malloc(sizeof(uint64_t *)*dim);
int j;
for(j=0;j<dim;j++)
{
t->entrys[i][j]=(uint64_t *) malloc(sizeof(uint64_t)*amount_reg);
}
}
}
int main()
{
list * table = (list *) malloc(sizeof(list));
init_list(table,3,2048*2048,2);
_getch();
}
我想要做的是分配一个 uint64_t 元素的 3d 数组,例如 table[4194304][3][2]。
任务管理器显示内存使用量为 560MB。二氧化碳
如果我尝试自己计算内存使用量,我将无法理解该值。
这是我的计算(对于 x64 系统):
2^20 * 8 Byte (first dimension pointers)
+ 2^20 * 3 * 8 Byte (second dimension pointers)
+ 2^20 * 3 * 2 * 8 Byte (for the values itsself)
= 2^20 * 8 Byte * 10 = 80MB
也许我的计算完全错误,或者我的代码会产生大量开销?!
如果是这样,有没有办法让这个程序的内存效率更高?
我无法想象像~2^23 uint64_t 这样的值需要这么多内存(因为2^23*8Byte 只是64MB)
【问题讨论】:
-
你的代码中没有“多维数组”。
-
不要将
malloc和朋友的结果投射到C中!注意:成为三星级程序员并不是恭维。 -
可能是
malloc开销让您感到困扰。您的代码对malloc()进行了 2²²×3 次调用,如果您分配一块内存并自己拆分它会更好。 -
@FUZxxl 你能举个例子吗,怎么做?
-
@Memphisd 给我一分钟。
标签: c memory-management multidimensional-array heap-memory