将结构传递给C中的函数

chr*_*isw 5 c

如果我有以下内容: -

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

void baz(struct foo qux)
{

}
Run Code Online (Sandbox Code Playgroud)

我是否正确地认为传递barbaz()本地副本bar被推入堆栈?如果是这样,这是什么类型的副本?在C++中,我假设它会调用复制构造函数或默认的复制构造函数,但我真的不知道这在C中是如何工作的.

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

通常,我会将指针传递给a,foo但我只是好奇它是如何工作的.此外,我的印象是传递指针更快,节省内存,是执行此类操作时建议的操作过程.我猜它是一个浅拷贝; 可以改变吗?

Mat*_*lia 4

我是否正确地认为将 bar 传递给 baz() 会导致 bar 的本地副本被推入堆栈?

是的。

我真的不知道这在 C 中是如何工作的。

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

我的印象是传递指针更快,节省内存,并且是执行此类操作时建议采取的操作过程。

对于较大的structs 来说通常是这种情况,但也并非总是如此;如果您有一小部分struct小字段,则复制的开销可能会小于间接的开销(此外,使用指针参数的成本可能很高,因为 C 和 C++ 的别名规则可能会阻止某些优化)。

我猜这是一个浅拷贝;这可以改变吗?

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

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