在 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
的例子中,不可能像我之前描述的那样搞砸,因为长度没有输入值,而且必须有一个返回的长度。