C++ 是否有人只使用参考变量来提高效率和减小尺寸?

C++ 是否有人只使用参考变量来提高效率和减小尺寸?,c++,variables,reference,C++,Variables,Reference,如果你们中的一些人还没有注意到,我是个笨蛋。话虽如此,我的问题是: 你们中有没有经验丰富的程序员使用引用变量来减少程序所需的内存?我在想,虽然这可能是一种危险的做法,但您可以在移动应用程序中使用引用变量,使它们使用更少的内存,使其更快 我知道C++中,当你把一个变量作为一个参数传递给一个函数,它创建一个变量的拷贝,但是你可以用它做一个引用变量,它只是指向变量内存位置。这难道不会使你的程序整体上使用更少的内存并使事情更快吗 这取决于(a)基础架构,(b)框架和(c)您使用的语言,但一般的答案是否-

如果你们中的一些人还没有注意到,我是个笨蛋。话虽如此,我的问题是:

你们中有没有经验丰富的程序员使用引用变量来减少程序所需的内存?我在想,虽然这可能是一种危险的做法,但您可以在移动应用程序中使用引用变量,使它们使用更少的内存,使其更快

我知道C++中,当你把一个变量作为一个参数传递给一个函数,它创建一个变量的拷贝,但是你可以用它做一个引用变量,它只是指向变量内存位置。这难道不会使你的程序整体上使用更少的内存并使事情更快吗

这取决于(a)基础架构,(b)框架和(c)您使用的语言,但一般的答案是-这不是最佳(甚至不是常见的)优化实践,-使用您的方法,程序可能运行得更慢(更慢!)

  • 对于大型对象,如结构和对象,引用使用的内存更少。然而,大多数人已经通过引用传递了这些信息,所以这对于我们的讨论来说并不重要

  • 较小的东西,如int和char,大小相同或小于引用。通过引用传递它们不会获得内存增益

  • 。。。但是有一个性能损失,因为引用需要取消引用才能操纵值

  • 最后,按引用传递比按值传递更容易出现错误。程序的构建应首先考虑正确性,其次考虑性能


  • 在C语言中,默认情况下变量是按值传递的,在大多数情况下,按引用传递没有任何优势,因为您仍然在传递值(它只是指针,而不是它引用的值)。请记住,指向字节的指针将大于字节本身

    对于更复杂的类型,如数组和结构,默认情况下C将通过引用传递它们。除非函数出于某种原因需要自己的结构副本,否则创建结构副本以传递到函数中的效率很低。
    如果您希望通过引用传递,但担心函数会更改结构,则可以使用const关键字来确保不能更改(或至少不容易更改)。

    char(size==1)与char(size==4或8)的引用相比如何?我不确定我是否理解这一点。您最初的假设是错误的-您建议使用引用可以减少内存使用,但按值传递字符需要1个字节,而按引用传递字符需要一个地址(通常为4或8个字节),更不用说后续的反引用来获取值了。我现在已经解释了这一部分,但所有这些都是刚刚传递的。在不将变量作为引用传递的情况下,程序必须在内存中创建一个新变量。传递地址是否比在内存中创建一个全新的变量并记住它的地址占用更多的内存和处理?这取决于体系结构和ABI,但通常值可以在寄存器和/或堆栈中传递。请确切解释为什么程序运行“慢得多”如果你使用引用,你能解释一下为什么它们会运行得较慢吗?如果你跳过了创建一个新变量的步骤,那会不会让它更快呢?@PaulR:正如我所说,这取决于一些事情。考虑到X86架构,没有任何类似CLR或JVM之类的东西,使用C或C++之类的东西。您有一个过程,需要向它传递一个wchar\u t,sizeof(wchar\u t)=1字节。如果将值放在堆栈上,只需写入1个字节,然后读取1个字节。如果在堆栈上放置对它的引用,则需要写入4个字节(考虑sizeof(MAddr)=4),读取4个字节,并从这4个字节指定的地址执行间接读取。下一个示例。将类的成员类实例链接到容器或在其中实例化是一个好主意吗?如果要实例化,请执行“ClassName objactName”并在容器构造函数中指定构造函数,否则执行“ClassName*objectRef”并使用“new ClassName(…)”。答案是第一个选项更适合编译器,因为它可以在编译时为成员的成员生成偏移量(例如,当它执行访问器内联时)。谢谢。我没有意识到取消参考会受到惩罚。我猜C++在背景中这样做,所以我甚至没有意识到它是一个伟大的。我绝对应该把下面的内容都写下来。