C++:传递一个包含数组的结构作为arg,我需要作为指针传递吗
C++: Passing a struct containing an array as arg, do I need to pass as pointer?
如果我有这样的结构:
struct S
{
int arr[10];
int x;
}
如果我有功能
void some_fun( struct S myS );
当我将结构S传递给该函数时,数组会被正确复制吗?还是必须将函数更改为:
void some_fun( struct S * myS ); ?
我已经测试过了(它在没有指针的情况下工作),但我对C/C++有点不安全,有时即使它是错误的,它也能工作。
当我将结构S传递给函数时,数组会被正确复制吗
是的,它将被复制。
我必须把函数改为:
void some_fun( struct S * myS )
吗
你可能想这么做有三个原因:
- 您希望避免复制-传递指针更便宜
-
您想要对
some_fun
内部的结构进行更改-指针允许您这样做;传递值不会 - 您希望降低堆栈溢出的风险-如果数组很大,传递值可能会使堆栈溢出。通过指针大大降低了这种风险
编辑:由于这是C++,您可以选择通过引用传递struct
:
void some_fun( S& myS ) // struct keyword is optional in C++
或
void some_fun( const S& myS ) // Do this if you do not plan on modifying myS
通过引用传递可以避免复制,类似于通过指针传递。与通过指针传递不同,通过引用传递向读取器指示传入的struct
引用了内存中的某个位置,而指针则为您提供了传递NULL
的选项。
如果您按值传递,就像您当前所做的那样,您的数组将由默认的复制构造函数复制(例如,请参阅此处:如何在复制控制函数中处理C++数组成员?)。
如果您决定通过指针传递,那么只有指向同一结构的指针才会传递到其中,因此您的数组不会被复制,您对数组(或结构的任何其他成员)所做的任何更改都会反映回您在函数之外访问的对象。
最终,决定选择哪种方法可以归结为以下几点:
- 你需要一份复印件吗?如果不是,通过const-reference会更好
- 是否需要修改与函数外的结构完全相同的结构?然后使用指针方法(或引用)
- 您是否需要函数中的副本,因为您想修改函数中的结构,但这些更改不应反映回调用位置?然后使用您当前使用的按值传递方法
您有3个选项:
本地复制版本:
void some_fun( struct S myS );
指针版本:
void some_fun( struct S* myS );
参考版本:
void some_fun( struct S& myS );
在后一个2中,对myS所做的更改将是持久的(影响原始实例)。在第一种情况下,您将获得本地副本。
它将传递数据结构的副本。这很好,除非您希望some_fun
更改传入的实际数据结构,否则您需要一个指针或引用。
当你放置一个带有const边界的数组时,它在运行时不再决定结构的大小。所以在你的情况下,数组是结构的一部分,而不是存储在不同的地方。简单地说:是的,它将被解析为函数!
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- 在现代 c++ 中,有什么好方法可以获取 arg 类型列表表单函数指针吗?
- 为什么有必要将"this"指针作为"arg"参数传递给pthread_create
- C++ 当函数 arg 类型为类接口时,无法传递对指针的引用
- 将数组传递给在 arg-list 中接受双指针的函数
- 功能指针(到其他内核)作为CUDA中的内核Arg
- C++:传递一个包含数组的结构作为arg,我需要作为指针传递吗
- 不能将size_t *arg[]传递给需要void指针数组的函数