gpt4 book ai didi

c++ - 为什么对相同常量的引用在 C++ 中占用不同的内存空间?

转载 作者:太空狗 更新时间:2023-10-29 19:41:22 25 4
gpt4 key购买 nike

我是 C++ 中引用概念的新手,我有一个关于纯数字常量引用的内存分配的问题。 (我想首先检查的另一件事是,我怀疑我经常遇到的 const reference 意味着对 const 的引用,但我不确定。)

这是我的 testing on ideone.com :

#include <stdio.h>

int main() {

const int r0 = 123;
const int &r1 = 123;
const int &r2 = 123;
const int &r3 = r2;

printf("%p\n", (void *)&r0);
printf("%p\n", (void *)&r1);
printf("%p\n", (void *)&r2);
printf("%p\n", (void *)&r3);

return 0;
}

结果:

0x7ffee3bd74c4
0x7ffee3bd74c8
0x7ffee3bd74cc
0x7ffee3bd74cc

r2r3 相同的原因从这个 answer - How does a C++ reference look, memory-wise? 中可以清楚地看出。 ,这表示它取决于编译器。但是我在想为什么编译器不也使 r0,r1,r2 都一样,因为它们都有相同的纯常量值 123。 (如果没有错误搜索,则称为 prvalue)

注意:在这个网站上搜索之后,我找到了一个最相关的 question - but in python .虽然语言不同,但我认为这个想法应该是相同/相似的:从链接来看,如果我的程序是用 python 编写的,那么内存空间中将只有一个 123 以节省空间。

我读过的一些其他答案:

  1. C++ do references occupy memory :这个答案表明,如果有必要,则将 int &x 实现为 *(pointer_to_x)
  2. How does a C++ reference look, memory-wise? : 这个答案表明编译器会尽力节省空间。

最佳答案

您的 123 不是“常量”。相反,它是一个文字。文字形成一个纯右值表达式(即用文字给定的值初始化的临时对象)。当您将该表达式绑定(bind)到 are 引用时,该对象的生命周期会延长到引用的生命周期,但这里的重点是每个这样的对象都是一个不同的对象,因此具有不同的地址。

如果您愿意,文本字符串“123”提供了如何创建对象的规则,但它本身并不是一个对象。您可以重写代码以使其更明确:

const int & r = int(123);   // temporary of type "int" and value "123"

(在 C++ 中没有单一的“常量”这样的东西。有很多东西在某种程度上是常量,但它们都需要更详细的考虑。)

关于c++ - 为什么对相同常量的引用在 C++ 中占用不同的内存空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53421559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com