2010-09-13 75 views
5

最近我查阅了一些C代码,并发现了一些等同于以下内容:结构在C数组成员

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

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

在大多数情况下,更换double *some_pointer会更好吗?

+0

空间使用效率低下取决于您是否使用分配的空间。如果总是使用整个数组,那么指针实际上会添加几个字节的浪费空间来存储指针本身(即使对于大数组而言可忽略不计)。 – altendky 2014-01-16 18:52:24

回答

7

如果你通过价值是的,它会做一切的副本。 但这就是指针存在的原因。

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

} 
+0

为了保持尽可能接近传值的效果,同时仍然可以使用'struct foo const * const myFoo'来获得通过引用的效率。这会告诉编译器在您意外地尝试修改指针或指向值时发出警告。 – altendky 2014-01-16 18:50:10

0

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

2

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

之间
double some_big_array[VERY_LARGE_NUMBER]; 
double *some_pointer 
选择仅在计划设计和如何这个字段/结构将被使用而定。后者允许使用可变大小的存储,但可能需要动态分配。

+0

+1由于无动于衷downvote – 2010-09-14 09:20:25

0

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

1

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

您还可以看到“结构黑客”(也通过与周围指针):

struct foo { 
    int some_innocent_variables; 
    double some_array[]; /* C99 flexible array member */ 
    /* double some_array[1]; ** the real C89 "struck 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 */ 
0

编辑:只要你通过引用(使用指针)传递它,结构是好的。

Offtopic: 小心结构破解,因为它是not strictly standard compliant;它忽略了自动填充。尽管如此,Unix IPC消息队列使用它(参见struct msgbuf),并且几乎可以肯定地使用任何编译器。

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