C++ 为什么指针更快更有效

C++ 为什么指针更快更有效,c++,c,performance,pointers,C++,C,Performance,Pointers,我在一本书中读到: 指针有多种用途,包括:•快速高效地创建 代码•为解决多种类型的问题提供了方便的方法 问题•支持动态内存分配•生成表达式 简洁紧凑•提供传递数据结构的能力 通过指针而不产生大量开销•保护传递的数据 作为函数的参数可以使用更快、更高效的代码 编写的原因是指针更接近硬件。就是 编译器可以更轻松地将操作转换为机器代码。 与指针相关的开销没有可能多 与其他操作员一起出席 问:“编译器轻松地将操作翻译成机器代码”与更快地处理代码有什么关系?编译器可能更容易转换,但它如何影响创建的可执行文

我在一本书中读到:

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

问:“编译器轻松地将操作翻译成机器代码”与更快地处理代码有什么关系?编译器可能更容易转换,但它如何影响创建的可执行文件的速度

既然最后所有的东西都被转换成机器指令,如果我想传递标准变量,使用指针怎么会有特殊的加速

有人能给一些关于使用指针如何使程序更快的见解吗


p.S.我明白,与其传递大量的“对象”,不如传递一个指针来复制资源,因为它更喜欢哪个指针,还有什么其他的吗?

这句话声称使用指针的代码更快,但它没有说比什么更快

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

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

非常旧的c编译器可能会为第一个版本生成比第二个版本快得多的代码。对于现代优化编译器来说,这不太可能有什么不同。一个好的编译器甚至可能为两者生成完全相同的机器代码(我还没有测试过)

更重要的是编写清晰的C代码,并让编译器生成实现它的最佳机器代码。

这绝对正确——指针和引用更接近机器语言。您的文本要表达的要点更多的是在“深度”副本中复制数据,而不是在“浅”副本中分配内存位置。我很清楚这是绝对正确的。作为一个例子,VisualBasic在这方面可能与C++相比有些含糊(也许偏离主题,但仍然相关)并且我能使乘法例程运行速度快一百倍,内存空间大,我可以通过在C++中用指针和引用实现算法来避免VB中的大部分分配和数据篡改。
如果您有一个数组和一个需要从数组中读取的例程,那么只复制数据结构的内存位置而不是复制目标数据结构的全部内容要快得多,这适用于任何编程语言。您需要遵循的唯一规则是,如果您写入通过引用或指针传递的内存,它将改变原始数据结构。

只有使用指针的代码比使用数组的等效代码快。但是指针从未存储在主内存中的寄存器中

但变量不必存在于主内存中。根据具体情况,编译器可以在其全部或部分生命周期中将其存储在寄存器中,并且访问寄存器比访问RAM快得多

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

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


但差别非常小

如果使用指针是“更快”,则取决于指针如何使用。抛出这本书。@ BoLo:这是C,不是C++。也许是从书中跳出来的?有人在去年的一本奥雷利的书中写了这样的东西?我希望你以某种方式误读了这一点,因为这样说在我看来是完全错误的。现代体系结构都有相对寻址,可以在不增加任何成本的情况下进行阵列偏移。@Jens Gustett不同意“现代体系结构都有相对寻址”。2014年,人们并不知道简单嵌入式处理器的成本相对寻址为0。你的第一句话适用于此:比什么更快?在这种上下文中(在大多数上下文中),C数组会退化为指针,并且C提供的任何其他工具都无法实现与指针相同的功能。此外,总结的书链接的结尾,“这本综合性的书有你需要的信息,无论你是初学者还是有经验的C或C++程序员或开发者。”知道书的读者包括C++程序员可以解释为什么这个陈述是被提出的。@贾斯凯文,不是同一个汇编程序,可能是真的,但很可能不是更多的语句。现代体系结构很乐意使用相对寻址。如果它们不生成相同的操作码,snip 1消耗的周期至少与snip 2相同。然后,您就有责任证明它们消耗相同的循环数。@这两种代码都可能生成完全相同的编译代码。我相信大多数编译器开发人员(尤其是大型团队)会将#1的次优代码视为一个需要及时解决的严重问题。@KeithThompson更明显的加速是将struct和指向struct的指针作为函数操作数传递,然后索引数组。。。(这会显著影响堆垃圾和传输所需的内存大小)。另外,函数指针可以很好地避免if或switch语句“绝对正确”?不,不是真的。现代体系结构很乐意使用基址寄存器和偏移量进行相对寻址。根本不需要指针来提高效率。编译器如何知道变量在哪里?如果你有
char s[] = "hello, world";
int i = 0;
while (s[i] != '\0') {
    /* do something with s[i] */
    i ++;
}