我想知道在同一作用域中指向同一对象的多个“常量引用”变量是否会产生内存开销:
const Animal& animal = getAnimal();
const Dog& dog = static_cast<const Dog&>(animal);
从概念上讲,animal
和dog
是两个变量,每个变量的指针大小,因此将占用2个寄存器(或堆栈上2 *指针大小的区域)。
但是(假设没有多重继承等),编译器可以知道它们在整个生命周期中都必须拥有相同的指针值。
那么,这两个变量可以共享一个寄存器(或堆栈上单个指针大小的区域)吗?
“可以”的意思是:
C ++标准允许吗?
当然可以,为什么不呢。您无法分辨出区别。所谓的“假设规则”允许编译器进行任何优化,只要可观察到的行为与未进行任何优化相同即可(请注意:有一些例外,其中允许优化更改可观察行为) 。
从概念上讲,动物和狗是两个变量,每个变量的指针大小为...
不。从概念上讲,引用是别名。它们不需要占用任何空间,因为它们只是实际对象的不同名称。C ++标准未指定引用的大小或实现方式。sizeof
引用为您提供了所引用对象的大小。引用的地址是被引用对象的地址。我不知道有任何方法可以区分引用是作为指针实现还是以其他方式实现(我强烈怀疑是否存在可移植的方式)。
现代编译器会这样做吗?
为了回答这个问题,我建议您采用一些真实的代码,并查看编译器的输出。这是一个很好的工具,可以帮助您:https : //godbolt.org/。
PS:我觉得有点误会。实际上const
,您的示例中的无关紧要。拥有const
引用并不意味着该值不会改变。这仅表示不允许您通过该引用更改值。也许最好举个例子:
struct foo {
const int& ref;
};
int main() {
int x = 1;
foo f{x};
x = 42;
}
这里f
有一个const
参考x
。这并不意味着它x
永远不会被修改。这仅表示f
无法x
通过进行修改ref
。这在多线程环境中尤其重要,在多线程环境中,假设一个对象const
仅是因为您拥有const
引用会引起麻烦。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句