【问题标题】:How does C++ "reference" references a variable?C++“引用”如何引用变量?
【发布时间】:2014-10-07 06:35:11
【问题描述】:

变量引入了与内存部分相关的标识符。现在,如果我们有对该变量的引用,那么引用的标识符是否也与该变量的内存部分相关联?我创建了一张图片来更好地解释我的意思;

int variable = 0;
int &rVariable = variable;

现在,在上面的代码执行之后,结果可能看起来像下面的方案?

因此我们可以将引用视为基于指针的抽象。因此,任何操作(包括获取引用的地址)实际上都将应用于被引用的实际对象。编译器可以分配内存来存储引用。但不能保证。

【问题讨论】:

  • 可能看起来像什么?
  • 添加了图片链接
  • 是的,引用只是引用对象的另一个名称 - 别名。原始名称和引用都表示同一个对象。
  • 实现定义:但是编译器愿意这样做。
  • 如果你愿意的话,它通常被实现为一个指针,而不是一个“软链接”(当引用占用内存时肯定会出现这种情况)。但这个问题不仅不具体,因为它取决于实现,而且过于宽泛,因为分析任何特定编译器的工作方式可能会写满一本书。

标签: c++ variables memory reference


【解决方案1】:

您的问题非常广泛,因此很难正确回答。在概念上,引用是对象的别名。特定编译器如何实现此概念可能会有所不同,尤其是在优化之后。在许多情况下,实现本质上使用指向对象的指针,在这种情况下,引用需要内存,而存储在那里的可能只是对象的地址。

struct S1{
    int & ri;
    S1(int &i):ri{i}{}
};

在这种情况下,我希望编译器需要内存来保存引用。

struct S2{
    int i;
    int& ri;
    S2():ri{i}{}
};

在这种情况下,引用可能不需要内存。

归根结底,不能依赖特定版本中的特定编译器处理引用的方式。

您是否将引用视为别名或指针,它必须始终指向一个对象(即永远不会为 nullptr)并且始终指向同一个对象(即 const)并且在您自己对一块的理解中自动取消引用代码可能并不重要。

虽然可以创建一个“空引用”,例如

int *i= nullptr;
int& ri=*i;

这是未定义的行为,如下所述:Assigning a reference by dereferencing a NULL pointer

未定义的行为意味着任何事情都可能发生,看起来在您的编译器上引用仍然像空指针一样,但是这里有一些编译器可能会非常奇怪的例子(并且允许在没有错误或警告的情况下)

int i;
//...
if(&i) {} //always true
else { 
    //optimized away 
}

int* i;
//...
if(i){}
else{
    //not optimized away
}

int *i = nullptr;
int& ri = *i;
//...
if(&ri){} //could be assumed always true!
else{
    //could be optimized away !!
}

int *i =nullptr;
*i++; //runtime error, convention says user should have checked for nullness
int& ri = i;
ri++; //probably runtime error, user does not know to check for nullness and may not be able to because of optimization assuming &ri ! nullptr

struct S{
    int i[1001];
};
S* s = nullptr;
S& rs = *s;
if(&rs){ //could be assume always true
    rs.i[1000] = 4; //may not result in runtime error, address could be 0x4000,
        // probably still not valid on a pc, on an embedded processor you could be
        // changing clock speed or something nasty even though you checked for 
        // nullness!!!!   Undefined behavior sucks!
}

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2011-09-09
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多