【问题标题】:C/ObjC - parameter size. Using a pointer vs valueC/ObjC - 参数大小。使用指针与值
【发布时间】:2011-05-10 13:59:13
【问题描述】:

我应该在什么时候在我的函数/方法中传递指向数据的指针,而不是仅仅传递值?

显然在某些情况下我希望函数对给定数据进行操作,但如果我只是为了信息/复制目的而传递值呢?

例如 foo 作为基本类型:

void setFoo(int foo);
...
int foo = 1;
setFoo(foo);

现在 foo 作为一个简单的结构:

typedef struct {
    int x;
    int y;
} Foo;

void setFoo(Foo foo);
...
Foo foo = {1, 2};
setFoo(foo);   // Apple code does this kind of thing with CGSize, CGPoint...

但是如果 foo 是一个更大的结构怎么办...

typedef struct {
    int x;
    int y;
    int z;
    char str[256];
} Foo;

void setFoo(Foo *foo);  // Now taking a pointer instead.
...
Foo foo = {1, 2, 3, etc ... };
setFoo(&foo);

问。在向函数提供数据时,我应该从什么时候开始使用指针?

谢谢

【问题讨论】:

    标签: c++ c parameter-passing


    【解决方案1】:

    在嵌入式系统上,我认为为非原始类型的任何内容传递指针(或引用)是一种很好的做法。这样,您的结构可以根据需要增长和添加成员,而不会影响复制的数据量。不必要的复制是降低系统速度的好方法,因此请尽可能避免。从长远来看,我认为养成这种习惯会有所帮助。

    【讨论】:

    • 是的,我总是将指针(或引用)用于比基本类型(例如 int、float)更大的任何东西。但是,我问的原因是我注意到 Apple 经常在不使用指针的情况下传递和返回 CGSize、CGPoint 结构类型。所以我想知道这里的门槛是多少。很久以前,我认为阈值是平台上的字长,但似乎并非如此,至少对于 Apple 的代码而言。
    • 我猜当你接近公共汽车的宽度时,你会想要考虑传递指针。
    • 所以没有硬性规定?主要是表现/习惯规则?我注意到 Apple 的 CoreGraphics 对传递由 4 个浮点数组成的 CGRect 类型一无所知。我在想,如果他们能在从 iPod 到 Mac 的所有设备上将这类事情作为高性能图形的一个组成部分,我也可以在参数传递部门为自己省去一些麻烦。
    • 我会说没有硬性/快速规则。就像另一个答案所说,这是您打算如何使用该功能的问题。例如,我打赌很多 CoreGraphics 的东西都不想在意外修改的情况下传递指针。并且数据足够小,可以快速复制
    【解决方案2】:

    如果适当地使用指向 [const] 对象的引用和/或指针,“何时”将变为“一直”

    【讨论】:

    • 您能定义“适当的”吗?例如:传递整数是不适合使用指针的明显情况。但是像 CGSize 或 CGPoint 这样的东西呢?
    • 当传递大于非本机类型的指针时(例如 double )将是一个很好的经验法则。
    • 您还必须考虑函数和编译器/执行平台的使用情况。如果您要以只读方式访问它十亿次,总体而言,传递一个大型结构并直接从堆栈帧中引用它可能比节省几微秒传递一个指向它的指针然后承担取消引用的成本要快十亿次指针或使用非堆栈内存。没有硬性规定,但在一般情况下,我会将任何类似结构的东西作为具有适当常量的指针传递。如果出现性能问题,则根据性能问题进行调整。
    猜你喜欢
    • 2015-05-25
    • 1970-01-01
    • 2021-12-16
    • 2020-04-01
    • 1970-01-01
    • 2015-05-03
    • 2014-06-17
    • 2013-01-13
    • 1970-01-01
    相关资源
    最近更新 更多