0

我正在学习 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 (?) 中不会发生。

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

4

2 回答 2

4

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

复制结构非常快——它本质上只是将字节从内存中的一个位置传送到另一个位置……但是复制指针更快。如果结构很小,您可以考虑复制它以避免额外的指针取消引用。但是,到目前为止,您很可能会过早地进行优化。

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

void printShirt( struct shirt const * shirt )

您的示例有点幼稚,因为printf即使复制一个相对较大的结构,其成本也远远大于复制。但我明白你想问什么。

于 2013-10-25T02:07:37.530 回答
-1

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

于 2013-10-25T02:06:44.173 回答