gpt4 book ai didi

c - 将结构传递给 C 中的函数

转载 作者:太空狗 更新时间:2023-10-29 15:02:30 25 4
gpt4 key购买 nike

如果我有以下内容:-

struct foo
{
int a;
int *b;
} bar;

void baz(struct foo qux)
{

}

我是否认为将 bar 传递给 baz() 会导致 bar 的本地副本被压入堆栈?如果是这样,这是什么样的副本?在 C++ 中,我假设它会调用复制构造函数或默认复制构造函数,但我真的不知道这在 C 中如何工作。

C 是否有默认复制构造函数的概念?它有名称吗?可以做些什么来执行深拷贝吗? (假设)。我能想到的唯一方法是实际进行深拷贝,然后将其传递给函数。

通常,我会传递一个指向 foo 的指针,但我只是想知道它是如何工作的。此外,我的印象是传递指针更快,节省内存,并且是进行此类操作时推荐采取的行动方案。我猜这是一个浅拷贝;这可以改变吗?

最佳答案

Am I right in thinking that passing bar to baz() results in a local copy of bar being pushed onto the stack?

是的。

I don't really know how this would work in C.

基本上与 C++ 中的默认复制构造函数一样;副本的每个字段都使用原始字段的相应字段进行初始化。当然,由于“好像”规则,整个事情可能会归结为 memcpy

I am under the impression that passing a pointer is faster, saves memory and is the recommended course of action to take when doing this kind of operation.

对于较大的struct,情况通常如此,但并非总是如此;如果你有几个小字段的小 struct 复制的开销可能会小于间接的开销(另外,使用指针参数可能会很昂贵,因为 C 和 C++ 的别名规则会阻止一些优化).

I would guess that it is a shallow copy; can this be changed?

不,浅复制(盲目复制每个字段)是默认复制构造函数发生的事情(而对于“深复制”,您通常意味着还创建指针/引用字段中引用的每个对象的副本)。

您的意思是“按引用传递”,它不是默认设置以允许最大的灵 active (并且为了与原始类型的传递保持一致)。如果你想通过引用传递你传递一个指针(或 C++ 中的引用),通常是 const 如果你只是为了性能,否则你传递对象本身。

关于c - 将结构传递给 C 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16093945/

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