在 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();
出于某种原因,我认为大多数人会本能地做出examine_data
获取一个指向 struct blob 的指针,但我不明白为什么。它仍然得到一个指针和一个整数,只是它们在一起更加清晰。并且在get_data
在这种情况下,不可能像我之前描述的那样搞乱,因为没有长度的输入值,并且必须有一个返回的长度。