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

C:将数据从堆复制到堆栈的成本?,c,memory-management,stack,heap,C,Memory Management,Stack,Heap,我正在学习C语言,想了解一下最佳实践 这里有两个实现(shirt是struct): 实施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

我正在学习C语言,想了解一下最佳实践

这里有两个实现(shirt是struct):

实施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");
}
void打印衬衫(衬衫衬衫){
printf((%d,%s)”,衬衫尺寸,衬衫颜色);
}
空白印花衬衫(衬衫*衬衫,内裤){
int i;
用于(i=0;isize,衬衫->颜色);
}
空白印花衬衫(衬衫*衬衫,内裤){
int i;

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

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

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

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

是的,这可能会对大型结构或较小结构的大数组产生影响,除非编译器能够优化调用。这是更正常的做法避免在已有副本时复制数据,尤其是在不打算修改副本的情况下

复制一个结构是相当快的——它基本上只是将字节从内存中的一个位置传递到另一个位置……但是复制指针更快。如果这个结构很小,你可以考虑复制它,这样你就避免了额外的指针撤销。但是,现在你很可能会陷入过早的优化。

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

void printShirt( struct shirt const * shirt )

您的示例有点幼稚,因为即使复制一个相对较大的结构,
printf
的成本也远远大于复制。但我理解您的要求。

是的,这可能会对大型结构或小型结构的大型数组产生影响,除非编译器能够优化调用。这是非常正常的al避免在您已有数据副本时复制数据,尤其是在您不打算修改副本的情况下

复制一个结构是相当快的——它基本上只是将字节从内存中的一个位置传递到另一个位置……但是复制指针更快。如果这个结构很小,你可以考虑复制它,这样你就避免了额外的指针撤销。但是,现在你很可能会陷入过早的优化。

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

void printShirt( struct shirt const * shirt )

您的示例有点幼稚,因为即使复制一个相对较大的结构,
printf
的成本也远远大于复制。但我理解您的要求。

是的,这可能会对大型结构或小型结构的大型数组产生影响,除非编译器能够优化调用。这是非常正常的al避免在您已有数据副本时复制数据,尤其是在您不打算修改副本的情况下

复制一个结构是相当快的——它基本上只是将字节从内存中的一个位置传递到另一个位置……但是复制指针更快。如果这个结构很小,你可以考虑复制它,这样你就避免了额外的指针撤销。但是,现在你很可能会陷入过早的优化。

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

void printShirt( struct shirt const * shirt )

您的示例有点幼稚,因为即使复制一个相对较大的结构,
printf
的成本也远远大于复制。但我理解您的要求。

是的,这可能会对大型结构或小型结构的大型数组产生影响,除非编译器能够优化调用。这是非常正常的al避免在您已有数据副本时复制数据,尤其是在您不打算修改副本的情况下

复制一个结构是相当快的——它基本上只是将字节从内存中的一个位置传递到另一个位置……但是复制指针更快。如果这个结构很小,你可以考虑复制它,这样你就避免了额外的指针撤销。但是,现在你很可能会陷入过早的优化。

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

void printShirt( struct shirt const * shirt )

您的示例有点幼稚,因为即使复制一个相对较大的结构,
printf
的成本也远远大于复制。但我理解您的要求。

因此需要找到一个折衷方案?数据复制与取消引用?是的,但您的代码中几乎总是存在比这个更大的瓶颈。这就是平台specific(例如64位指针与32位指针)。因此,我提到了过早优化。99.99%的情况下,您会希望通过指针传递结构。为了确保我真正理解它,在任何代码中,“d[I]=5”和“&d[I]>5”都会做完全相同的事情(不是从结果的角度,而是从内存管理的角度)?(这里我的重点不是优化我的代码,只是为了确保我的主要原则正确)。将指针作为
&shirts[I]
shirts+I
传递是正确的。我不明白