0

我目前正在为 C 开发一个简单的克隆检测器,用 C++ 编写,并且不断地问自己关于效率和如何优化 C++ 代码的问题。

我的一个问题是关于如何有效地传递结构。如果给出类似于以下内容的结构:

typedef struct {
    unsigned int a;
    void *b;
} my_struct;

以及一个对其 my_struct 参数执行大量操作(而非赋值)的函数。在 AST 遍历中为每个节点调用这个函数(所以很多......),并且根据一些初步阅读,我的理解是传递结构的实例(非指针)会导致它的副本为被调用函数制作。

因此,将结构作为指针传递然后取消引用是否更有效?

void foo(my_struct *s) {
    // then dereference s->a...

基本上:复制速度与取消引用速度是我的问题。

我认为,由于内存消耗,将结构作为指针传递会更聪明,但我不知道有关速度的任何副作用。

4

2 回答 2

1

这取决于。

在您的情况下,您的结构并不比指针大多少;将整个结构作为函数参数传递很可能不会比传递指针慢很多。

在您的函数内部,通过指针访问结构成员可能比访问本地结构对象的成员慢。如果是这样,那么如果你在函数内部做了很多事情,那么直接传递结构可能会给你更快的代码。但这取决于 CPU 的能力和生成的代码;无论是否通过指针,成员访问都可能具有相同的速度。

回答这个问题的唯一方法是衡量你自己代码的性能。您得到的任何答案都将仅适用于您自己当前的情况,并且可能会在其他目标系统或不同版本的编译器上发生变化。

确保您告诉编译器优化您的代码。如果你不这样做,那么衡量性能就没有多大意义了。

于 2013-03-26T21:29:06.813 回答
0

读取堆栈(副本)将更加可靠,因为堆栈不太可能从缓存中分页出来,但是您也会承担执行复制的成本,并且可能会更多地填充堆栈。

我的经验法则是按值传递“简单”数据,按引用传递“复杂”数据。通常,如果我的数据超过 8-16 个字节,我会开始考虑是否值得通过参考。

这里要考虑的另一件事是它是否值得优化。我尽量避免以意想不到的方式(与代码的其余部分不同)做事,除非我能证明存在或将会出现问题,因为打破模式会使代码更难支持。

于 2013-03-26T21:30:18.993 回答