我正在学习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(?)中。
对于大型阵列和结构可能会产生影响吗? 是否有一些最佳实践可以遵循?
答案 0 :(得分:4)
是的,除非编译器能够优化呼叫,否则这会对大型结构或较小结构的大型数组产生影响。当你已经拥有它的副本时,避免复制数据更为正常 - 特别是如果你不打算修改副本。
复制结构非常快 - 它实际上只是将字节从内存中的一个位置缓存到另一个位置......但复制指针的速度更快。如果结构很小,您可以考虑复制它,以避免额外的指针解除引用。但是,到现在为止,您可能会进入过早优化阶段。
回到指针方法,通常你会帮助程序员意识到不会通过接收const
指针来修改数据:
void printShirt( struct shirt const * shirt )
你的例子有点天真,因为printf
的成本远远大于复制相对较大的结构。但我明白你要问的是什么。
答案 1 :(得分:-1)
您将使用较少的内存实现2,因为您只将地址(指针)传递给printShirt函数。如果大小的衬衫很大,实施1可能会很慢,因为你要复制结构中的所有字段,它也会消耗更多的内存。