为什么指针更快更有效

时间:2014-07-06 20:01:40

标签: c++ c performance pointers

我在C book中看到了这个:

  

指针有多种用途,包括:•快速高效地创建   代码•提供一种方便的方法来处理许多类型的   问题•支持动态内存分配•制作表达式   紧凑和简洁•提供传递数据结构的能力   通过指针而不会产生大量开销•保护传递的数据   作为函数的参数。 更快,更高效的代码可以   写,因为指针更接近硬件。那就是   编译器可以更轻松地将操作转换为机器代码。   没有与指针相关的开销那么多   与其他运营商一同出席。

Q值。如何将编译器轻松地转换为机器代码'与更快的代码工作有关?编译器可能更容易转换,但它如何影响创建的可执行文件的速度?

Q值。因为,最后一切都被转换成了机器指令,如果我宁愿传递正常的变量,如何使用指针给出一些特殊的加速?

有人可以提供一些有关使用指针如何使程序更快的见解吗?

PS 我明白,不是传递大量的对象,而是传递指针在复制资源方面会更好,还有什么比这更好的了指针是首选?

3 个答案:

答案 0 :(得分:15)

该引言声称使用指针的代码更快,但它并没有比更快地说明

最常见的说法是使用指针的代码比使用数组索引的等效代码更快。例如:

char s[] = "hello, world";
char *p = s;
while (*p != '\0') {
    /* do something with *p */
    p ++;
}

VS

char s[] = "hello, world";
int i = 0;
while (s[i] != '\0') {
    /* do something with s[i] */
    i ++;
}

很老的c编译器可能为第一个版本生成的代码明显快于第二个版本。对于现代优化编译器,它不太可能有任何区别。一个好的编译器甚至可能为两者生成完全相同的机器代码(我还没有对此进行测试)。

编写 clear C代码并让编译器生成实现它的最佳机器代码更为重要。

答案 1 :(得分:1)

这绝对是正确的 - 指针和引用更接近机器语言。您的文本所做的更多是关于在“深度”副本中复制数据而不是在“浅”副本中分配内存位置。我完全清楚这是绝对正确的。作为一个例子,在这方面,与C ++相比,Visual Basic可能有些含糊不清(可能是偏离主题,但仍然相关)并且我能够使乘法例程以大约100倍的速度运行,因为欠大的内存空间事实上,通过在C ++中使用指针和引用实现算法,我能够避免VB中的大部分分配和数据杂乱。

如果你有一个数组和一个需要从数组中读取的例程,那么只复制数据结构的内存位置而不是目标数据结构的整个内容要快得多任何编程语言。您需要遵循的唯一规则是,如果您写入通过引用或指针传递的内存,它将改变原始数据结构。

答案 2 :(得分:0)

只有使用指针的代码要比使用数组的等效代码快,但是指针永远不会存储在主内存中的寄存器中。

但是变量不必存在于主存储器中。视情况而定,编译器可以将其全部或部分寿命存储在寄存器中,并且访问寄存器要比访问RAM快得多。

通过“指针”访问(而不是直接访问)确实需要(一点)额外的工作,并且(稍长)时间。

无论是指针变量(C还是C ++)还是引用变量(仅C ++),都会发生完全相同的事情。

但是差别很小。