【问题标题】:Struct with array member in CC中带有数组成员的结构
【发布时间】:2011-04-11 21:07:32
【问题描述】:

最近我查看了一些 C 代码,发现与以下内容等效:

struct foo {
    int some_innocent_variables;
    double some_big_array[VERY_LARGE_NUMBER];
}

几乎,但不完全是,几乎完全是 C 中的新手,我是否认为这个结构由于数组成员而在空间使用方面效率非常低?当这个结构作为参数传递给函数时会发生什么?是否完整复制到堆栈上,包括整个数组?

在大多数情况下使用double *some_pointer 会更好吗?

【问题讨论】:

  • 空间使用效率低取决于您是否使用分配的空间。如果总是使用整个数组,那么指针实际上会增加几个字节的浪费空间来存储指针本身(即使对于大型数组来说可以忽略不计)。

标签: c arrays struct


【解决方案1】:

作为参数传递,它将被复制,这是一种非常低效的传递结构的方式,尤其是大结构。但是,基本上,结构是通过指针传递给函数的。

选择

double some_big_array[VERY_LARGE_NUMBER];

double *some_pointer

仅取决于程序设计以及如何使用该字段/结构。后者允许使用可变大小的存储,但可能需要动态分配。

【讨论】:

    【解决方案2】:

    编辑:只要您通过引用(使用指针)传递该结构就可以了。

    题外话: 当心结构黑客,因为它是not strictly standard compliant;它忽略了自动填充。不过,Unix IPC 消息队列使用它(请参阅struct msgbuf),而且几乎可以肯定它可以与任何编译器一起使用。

    也就是说,使用该结构的函数可以使用指向它的指针而不是使用副本。

    【讨论】:

      【解决方案3】:

      正如其他人所说,该类型的对象通常使用指针传递(总是sizeof (struct foo) 字节,通常是 4 个字节)。

      您可能还会看到“struct hack”(也通过指针传递):

      struct foo {
          int some_innocent_variables;
          double some_array[]; /* C99 flexible array member */
          /* double some_array[1]; ** the real C89 "struck hack" */
      }
      

      这个“struct hack”得到一个由malloc调用大小的数组。

      /* allocate an object of struct foo type with an array with 42 elements */
      struct foo *myfoo = malloc(sizeof *myfoo + 42 * sizeof *myfoo->some_array);
      /* some memory may be wasted when using C89 and
         the "struct hack" and this allocation method */
      

      【讨论】:

        【解决方案4】:

        如果您按值传递 yes,它将复制所有内容。 但这就是指针存在的原因。

        //Just the address is passed 
        void doSomething(struct foo *myFoo)
        {
        
        }
        

        【讨论】:

        • 要尽可能接近按值传递,同时仍然获得按引用传递的效率,您可以使用struct foo const * const myFoo。当您不小心尝试修改指针或指向的值时,这将告诉编译器警告您。
        【解决方案5】:

        在结构中使用数组有很多理由。其中之一是结构通过值传递给函数,而数组通过引用传递。也就是说,这个结构很可能是通过指针传递给函数的。

        【讨论】:

          【解决方案6】:

          是的,在 C 语言中,由于效率原因,您通常会传递一个指向结构的指针。

          【讨论】:

            猜你喜欢
            • 2012-12-12
            • 2017-06-11
            • 2011-03-04
            • 2015-09-24
            • 2017-11-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多