所以我相信在64位系统上指针是8B。浮点数是4B。假设您有以下代码:
const float a = 1.0f;
那么,我想知道以下项目的成本比较。假设我们有
const float b = a;
我知道复制float
将是4B。但我认为,如果我们不需要复制float
,我们可以"保存"内存。我知道,如果它不是float
,而是一个大对象(>8B),以类似的方式使用引用将是更理想的:
const float &b = a;
然而,由于我们使用float,它更紧凑的复制到一个新的变量吗?假设编译器不会优化任何东西?
const float a = b;
const float &a = b;
如果您写入const float b = a;
,那么您正在复制该值。现在,如果类型是基本类型或者没有自定义复制构造函数的普通可复制类型,编译器可以轻松地优化副本,并且根本不会生成实际代码。除非你取对象的地址:
#include <iostream>
int main() {
const float a = 1.0;
const float b = a;
const float &r = a;
std::cout << "&a == &b: " << (&a == &b ? "true" : "false") << std::endl;
std::cout << "&a == &r: " << (&a == &r ? "true" : "false") << std::endl;
}
给:
&a == &b: false
&a == &r: true
可以看到a
和b
有不同的地址。它们是不同的对象,编译器将不得不添加一个名为b
的a
副本。另一方面,引用r
是与a
相同的对象,因此它具有相同的地址。编译器不会复制。
如果a
不是普通类型,并且编译器不能消除复制构造函数,也适用。引用是一个完全的NOP,它只是给现有对象另一个名字。
但不要将其与通过引用传递值或在结构体或类中存储引用混淆。在内部,引用是作为指针实现的。如果传递引用,则传递指针的副本。如果存储引用,则存储指针。
只有局部引用,编译器才能直接使用原始对象。