多个"常量引用"变量可以共享同一个内存吗?
Can multiple 'const reference' variables share the same memory?
我想知道在同一范围内将多个"常量引用"变量指向同一对象是否有内存成本:
const Animal& animal = getAnimal();
const Dog& dog = static_cast<const Dog&>(animal);
从概念上讲,animal
和dog
是两个变量,每个变量的指针大小,因此将占用 2 个寄存器(或堆栈上的 2* 指针大小区域(。
但是(假设没有多重继承等(,编译器可以知道它们都必须在其生命周期中保持相同的指针值。
那么,这两个变量可以共享单个寄存器(或堆栈上的单个指针大小的区域(吗?
通过"can",我的意思是:
- C++标准允许吗?
- 现代编译器会这样做吗?
C++标准允许吗?
当然,为什么不呢。你无法分辨出其中的区别。所谓的"as-if 规则"允许编译器进行任何优化,只要可观察行为与未进行任何优化的行为相同(旁注:也有例外,允许优化更改可观察行为(。
从概念上讲,动物和狗是两个变量,每个变量的指针大小,...
不。从概念上讲,引用是别名。它们不需要占用任何空间,因为它们只是实际对象的不同名称。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
无法通过ref
修改x
。这在多线程环境中尤其重要,因为仅仅因为您有一个const
引用就假定对象const
会导致麻烦。
多个"常量引用"变量可以共享相同的内存吗?
当然,变量有时可以共享内存。在某些情况下,这两个变量都可能使用任何内存。
这适用于所有普通类型。
从概念上讲,动物和狗是两个变量,每个变量的指针大小
从概念上讲,该标准没有指定引用的大小。但实际上,如果引用变量需要存储,那么它确实是指针的大小。
C++标准允许吗?
是的。
现代编译器会这样做吗?
取决于上下文。有些情况下他们会这样做,有些情况下他们实际上不能。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- 多个"常量引用"变量可以共享同一个内存吗?
- 为什么同一个变量的内存地址不同?
- 两个单链列表共享同一个节点和析构函数两次删除相同的内存
- 是否可以让两个c++程序访问同一个内存位置
- 为什么同一个内存位置同时包含不同的值
- c++多次内存分配给同一个指针
- 将内存分配给一个指针,将另一个指针指向同一个指针,并删除第二个指针