C++:将包含数组的结构作为arg传递,我是否需要作为指针传递?

4 c++ arrays struct

如果我有这样的结构:

struct S
{
    int arr[10];
    int x;
}
Run Code Online (Sandbox Code Playgroud)

如果我有一个功能

void some_fun( struct S myS );
Run Code Online (Sandbox Code Playgroud)

当我将struct S传递给该函数时,是否会正确复制数组,或者我必须将函数更改为:

void some_fun( struct S * myS ); ?
Run Code Online (Sandbox Code Playgroud)

我已经测试了这个(它没有指针就可以工作)但我对C/C++有点不安全,有时即使它是错误的也有效.

das*_*ght 6

当我将struct S传递给该函数时,是否会正确复制数组

是的,它将被复制.

我是否必须将功能更改为: void some_fun( struct S * myS )

您可能希望这样做有三个原因:

  • 你想避免复制 - 传递指针更便宜
  • 你想对结构内部进行更改some_fun - 指针允许你这样做; 通过值不会
  • 您希望降低堆栈溢出的风险 - 如果数组很大,则按值传递可能会溢出堆栈.通过指针传递可以大大降低这种风险.

编辑:由于这是C++,您可以选择传递struct引用:

void some_fun( S& myS ) // struct keyword is optional in C++
Run Code Online (Sandbox Code Playgroud)

要么

void some_fun( const S& myS ) // Do this if you do not plan on modifying myS
Run Code Online (Sandbox Code Playgroud)

通过引用传递避免以类似于通过指针传递的方式进行复制.与通过指针传递不同,通过引用传递指示读者struct传入引用内存中的某个位置,而指针则为您提供传递a的选项NULL.

  • 你也可以传递*reference*,如果参数不是可选的,那么这可能更有意义(如果你的编码指南允许的话) (3认同)
  • "你需要避免堆栈溢出",很容易被误解;) (2认同)

cod*_*ing 1

如果您按值传递(就像您当前所做的那样),您的数组将由默认的复制构造函数复制(请参见此处:How are C++ arraymemberhandled in copy control functions?)。

如果您决定通过指针传递,则只会将指向同一结构的指针传递给它 - 因此您的数组将不会被复制,您对数组(或结构的任何其他成员)所做的任何更改都会反映回您在函数外部访问的对象。

最终,可以归结为以下几点来决定选择哪种方法:

  • 您需要函数中的副本吗?如果没有,通过const 引用传递会更好
  • 您是否需要修改函数外部完全相同的结构?然后使用指针方法(或引用)。
  • 您是否需要函数中的副本,因为您想修改函数中的结构,但这些更改不应反映回调用位置?然后使用您当前正在使用的传值方法!