C:从堆到堆栈复制数据的成本?

时间:2013-10-25 02:00:02

标签: c memory-management stack heap

我正在学习C,并想询问最佳实践。

这里有两个实现(衬衫是结构):

实施1:

void printShirt(shirt shirt){
    printf("(%d , %s)",shirt.size,shirt.color);
}
void printShirts(shirt * shirts, int nbShirts){
    int i;
    for(i=0;i<nbShirts;i++) printShirt(shirts[i]);
    printf("\n");
}

实施2:

void printShirt(shirt * shirt){
    printf("(%d , %s)",shirt->size,shirt->color);
}
void printShirts(shirt * shirts, int nbShirts){
    int i;
    for(i=0;i<nbShirts;i++) printShirt(&shirts[i]);
    printf("\n");
}

如果我是正确的(?),在实现1中,每个衬衫的数据在打印之前从堆复制到堆栈。但这不会发生在实现2(?)中。

对于大型阵列和结构可能会产生影响吗? 是否有一些最佳实践可以遵循?

2 个答案:

答案 0 :(得分:4)

是的,除非编译器能够优化呼叫,否则这会对大型结构或较小结构的大型数组产生影响。当你已经拥有它的副本时,避免复制数据更为正常 - 特别是如果你不打算修改副本。

复制结构非常快 - 它实际上只是将字节从内存中的一个位置缓存到另一个位置......但复制指针的速度更快。如果结构很小,您可以考虑复制它,以避免额外的指针解除引用。但是,到现在为止,您可能会进入过早优化阶段。

回到指针方法,通常你会帮助程序员意识到不会通过接收const指针来修改数据:

void printShirt( struct shirt const * shirt )

你的例子有点天真,因为printf的成本远远大于复制相对较大的结构。但我明白你要问的是什么。

答案 1 :(得分:-1)

您将使用较少的内存实现2,因为您只将地址(指针)传递给printShirt函数。如果大小的衬衫很大,实施1可能会很慢,因为你要复制结构中的所有字段,它也会消耗更多的内存。