多个“ const reference”变量可以共享同一内存吗?

短信

我想知道在同一作用域中指向同一对象的多个“常量引用”变量是否会产生内存开销:

const Animal& animal = getAnimal();
const Dog& dog = static_cast<const Dog&>(animal);

从概念上讲,animaldog是两个变量,每个变量的指针大小,因此将占用2个寄存器(或堆栈上2 *指针大小的区域)。

但是(假设没有多重继承等),编译器可以知道它们在整个生命周期中都必须拥有相同的指针值。

那么,这两个变量可以共享一个寄存器(或堆栈上单个指针大小的区域)吗?
“可以”的意思是:

  • C ++标准允许吗?
  • 现代编译器会这样做吗?
maximum_prime_is_463035818

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

头文件中const变量的多个定义

来自分类Dev

头文件中const变量的多个定义

来自分类Dev

是否可以通过C ++扩展强制多个python进程共享同一内存?

来自分类Dev

const char *的多个定义

来自分类Dev

const React 的多个参数

来自分类Dev

多个Azure webjob可以共享同一程序集吗?

来自分类Dev

多个Spring集成聚合器可以共享同一消息存储吗?

来自分类Dev

多个访客可以共享同一个IP地址吗?

来自分类Dev

Pytest-多个测试可以共享同一请求响应吗?

来自分类Dev

多个Azure webjob可以共享同一程序集吗?

来自分类Dev

多个应用程序可以共享同一个Lucene索引吗?

来自分类Dev

多个线程可以同时访问共享内存吗?

来自分类Dev

如何从一个内存块中排序的多个转换单元中放置多个const对象?

来自分类Dev

一个ViewController可以管理多个页面以促进变量共享吗?

来自分类Dev

多个int到const char *

来自分类Dev

多个使用 Redisson 的独立应用程序可以共享同一个集群 Redis 吗?

来自分类Dev

我可以在多个可以在Octave中调用的C ++函数中描述一个共享变量吗?

来自分类Dev

为什么指向同一个内存的多个共享指针会导致内存泄漏?

来自分类Dev

包含const变量且包含在多个文件中的标头的链接错误?

来自分类Dev

我可以修改const成员变量吗?

来自分类Dev

可以更改const char *变量吗?

来自分类Dev

使用同一模型可以有多个hasMany关系吗?

来自分类Dev

同一HTML元素上可以有多个指令吗?

来自分类Dev

同一目录可以有多个gitignore配置吗?

来自分类Dev

多个线程可以获取同一锁吗?

来自分类Dev

可以在同一块中存储多个文件吗?

来自分类Dev

同一Redis实例可以支持多个Spring会话吗?

来自分类Dev

我可以在同一流上使用多个BinaryWriters吗?

来自分类Dev

同一维表可以与多个事实表相关吗?

Related 相关文章

  1. 1

    头文件中const变量的多个定义

  2. 2

    头文件中const变量的多个定义

  3. 3

    是否可以通过C ++扩展强制多个python进程共享同一内存?

  4. 4

    const char *的多个定义

  5. 5

    const React 的多个参数

  6. 6

    多个Azure webjob可以共享同一程序集吗?

  7. 7

    多个Spring集成聚合器可以共享同一消息存储吗?

  8. 8

    多个访客可以共享同一个IP地址吗?

  9. 9

    Pytest-多个测试可以共享同一请求响应吗?

  10. 10

    多个Azure webjob可以共享同一程序集吗?

  11. 11

    多个应用程序可以共享同一个Lucene索引吗?

  12. 12

    多个线程可以同时访问共享内存吗?

  13. 13

    如何从一个内存块中排序的多个转换单元中放置多个const对象?

  14. 14

    一个ViewController可以管理多个页面以促进变量共享吗?

  15. 15

    多个int到const char *

  16. 16

    多个使用 Redisson 的独立应用程序可以共享同一个集群 Redis 吗?

  17. 17

    我可以在多个可以在Octave中调用的C ++函数中描述一个共享变量吗?

  18. 18

    为什么指向同一个内存的多个共享指针会导致内存泄漏?

  19. 19

    包含const变量且包含在多个文件中的标头的链接错误?

  20. 20

    我可以修改const成员变量吗?

  21. 21

    可以更改const char *变量吗?

  22. 22

    使用同一模型可以有多个hasMany关系吗?

  23. 23

    同一HTML元素上可以有多个指令吗?

  24. 24

    同一目录可以有多个gitignore配置吗?

  25. 25

    多个线程可以获取同一锁吗?

  26. 26

    可以在同一块中存储多个文件吗?

  27. 27

    同一Redis实例可以支持多个Spring会话吗?

  28. 28

    我可以在同一流上使用多个BinaryWriters吗?

  29. 29

    同一维表可以与多个事实表相关吗?

热门标签

归档