C 假设我们有一个非常大的结构,在分配时会占用巨大的内存空间
我对C(和C中的结构)是新手。我在互联网上看到了各种各样的代码示例,但这样做的好处是什么:C 假设我们有一个非常大的结构,在分配时会占用巨大的内存空间,c,pointers,struct,C,Pointers,Struct,我对C(和C中的结构)是新手。我在互联网上看到了各种各样的代码示例,但这样做的好处是什么: void foo(最大结构*struct) 而不是这个 void foo(大结构) 它使内存管理更容易吗?前者将指向结构的指针传递给函数。后者复制结构并将其传递给函数。如果结构较大,则为函数制作一个副本的成本很高(需要大量资源),因此除非必要,否则应避免使用。C按值传递structs。这意味着,具有第二个签名的函数将复制整个LargeStruct,以便将其传递给foo。这在内存使用方面并不经济 更糟糕的是
void foo(最大结构*struct)代码>
而不是这个
void foo(大结构)代码>
它使内存管理更容易吗?前者将指向结构的指针传递给函数。后者复制结构并将其传递给函数。如果结构较大,则为函数制作一个副本的成本很高(需要大量资源),因此除非必要,否则应避免使用。C按值传递struct
s。这意味着,具有第二个签名的函数将复制整个LargeStruct
,以便将其传递给foo
。这在内存使用方面并不经济
更糟糕的是,LargeStruct
的分配会发生在自动内存中(也称为“堆栈上”)。根据结构的实际大小,在某些系统上可能无法进行调用,因为这会导致堆栈溢出
另一方面,第一种方法通过指针传递struct
。指针的大小不取决于LargeStruct
的大小,因为C是按值传递参数的,主要有两点:
在函数体中,您将收到传入参数的副本,因此在void foo(LargeStruct-struct)的情况下代码>,您将获得结构的一个副本,当您修改结构的成员时,它实际上在外部看不到,因为它是一个临时副本,在函数返回时会被销毁。因此,如果要修改结构,必须传入指向该结构的指针
由于参数是复制的,并且如果结构非常大,则会有一些内存开销。在这种情况下,如果不想修改结构,只是为了最小化内存开销,可以传递一个常量指针:
foo(const LargeStruct*p)代码>
是否应该改写第一句话,例如“C通过值传递参数”?@FiddlingBits实际上不是:C对数组例外,数组会衰减为指针。