gpt4 book ai didi

c - 在 C 中按值传递结构而不是传递指针有什么缺点吗?

转载 作者:太空狗 更新时间:2023-10-29 16:14:15 26 4
gpt4 key购买 nike

在 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 的情况下,不可能像我之前描述的那样搞砸,因为长度没有输入值,并且必须有返回的长度。

最佳答案

对于小型结构(例如点、矩形),按值传递是完全可以接受的。但是,除了速度之外,还有一个原因导致您应该小心按值传递/返回大型结构:堆栈空间。

许多 C 编程是针对嵌入式系统的,其中内存非常宝贵,堆栈大小可能以 KB 甚至字节为单位...如果您按值传递或返回结构,则这些结构的副本将被放置在堆栈上,可能导致 this site 的情况以...命名

如果我看到一个应用程序似乎使用了过多的堆栈,按值传递的结构是我首先要查找的内容之一。

关于c - 在 C 中按值传递结构而不是传递指针有什么缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/161788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com