在C中通过值传递结构而不是传递指针是否有不利之处?
如果结构很大,显然有复制大量数据的性能方面,但是对于较小的结构,它基本上应该与将多个值传递给函数相同。
当用作返回值时,它甚至可能更有趣。C仅具有从函数返回的单个值,但是您经常需要多个。因此,一个简单的解决方案是将它们放在结构中并返回该结构。
是否有任何理由支持或反对?
由于可能不是所有人都知道我在这里说的是什么,所以我举一个简单的例子。
如果您使用C语言进行编程,则迟早会开始编写如下所示的函数:
void examine_data(const char *ptr, size_t len)
{
...
}
char *p = ...;
size_t l = ...;
examine_data(p, l);
这不是问题。唯一的问题是,您必须与您的同事达成共识,在该同事中,参数应为顺序,以便在所有功能中使用相同的约定。
但是,当您想返回相同类型的信息时会发生什么呢?您通常会得到以下内容:
char *get_data(size_t *len);
{
...
*len = ...datalen...;
return ...data...;
}
size_t len;
char *p = get_data(&len);
这可以正常工作,但存在更多问题。返回值是一个返回值,除了在此实现中不是。从上面无法得知,不允许函数get_data查看len指向什么。没有什么可以使编译器检查通过该指针实际返回的值。因此,下个月,当其他人修改了代码却没有正确理解它(因为他没有阅读文档?)时,它就崩溃了,而没有任何人注意,或者它开始随机崩溃。
所以,我提出的解决方案是简单的结构
struct blob { char *ptr; size_t len; }
可以这样重写示例:
void examine_data(const struct blob data)
{
... use data.tr and data.len ...
}
struct blob = { .ptr = ..., .len = ... };
examine_data(blob);
struct blob get_data(void);
{
...
return (struct blob){ .ptr = ...data..., .len = ...len... };
}
struct blob data = get_data();
出于某种原因,我认为大多数人会本能地使inspect_data采用指向struct blob的指针,但我不明白为什么。它仍然有一个指针和一个整数,更清楚的是它们在一起。在get_data的情况下,不可能以我之前描述的方式弄乱,因为长度没有输入值,并且必须有返回的长度。
gettimeofday
)都应使用指针,而人们以它为例。
void examine data(const struct blob)
是不正确的。