Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 假设我们有一个非常大的结构,在分配时会占用巨大的内存空间_C_Pointers_Struct - Fatal编程技术网

C 假设我们有一个非常大的结构,在分配时会占用巨大的内存空间

C 假设我们有一个非常大的结构,在分配时会占用巨大的内存空间,c,pointers,struct,C,Pointers,Struct,我对C(和C中的结构)是新手。我在互联网上看到了各种各样的代码示例,但这样做的好处是什么: void foo(最大结构*struct) 而不是这个 void foo(大结构) 它使内存管理更容易吗?前者将指向结构的指针传递给函数。后者复制结构并将其传递给函数。如果结构较大,则为函数制作一个副本的成本很高(需要大量资源),因此除非必要,否则应避免使用。C按值传递structs。这意味着,具有第二个签名的函数将复制整个LargeStruct,以便将其传递给foo。这在内存使用方面并不经济 更糟糕的是

我对C(和C中的结构)是新手。我在互联网上看到了各种各样的代码示例,但这样做的好处是什么:

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对数组例外,数组会衰减为指针。