C 引用在内存方面看起来如何?

新手上路,请多包涵

鉴于:

 int i = 42;
int j = 43;
int k = 44;

通过查看变量地址,我们知道每个变量占用 4 个字节(在大多数平台上)。

但是,考虑到:

 int i = 42;
int& j = i;
int k = 44;

我们将看到变量 i 确实占用了 4 个字节,但 j 没有 占用,而 k 再次占用堆栈上的 4 个字节。

这里发生了什么?看起来 j 在运行时根本不存在。我作为函数参数收到的引用呢?这 必须 在堆栈上占用一些空间……

当我们这样做时 - 为什么我不能定义一个数组或引用?

 int&[] arr = new int&[SIZE]; // compiler error! array of references is illegal

原文由 Yuval Adam 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 352
2 个回答

在遇到引用 j 的任何地方,它都会被 i 的地址 替换。所以基本上引用内容地址是在编译时解析的,不需要在运行时像指针那样解引用。

_只是为了澄清我所说的 i 的地址是什么意思_:

 void function(int& x)
{
    x = 10;
}

int main()
{
    int i = 5;
    int& j = i;

    function(j);
}

在上面的代码中, j 不应该在 主堆栈 上占据空间,但 函数 的引用 x 将在其堆栈上占据一个位置。这意味着当以 j 作为参数调用 function 时, i 的地址 将被压入 function 的堆栈中。编译器可以也不应该在 主堆栈 上为 j 保留空间。

对于数组部分,标准说::

C++ 标准 8.3.2/4:

不应有对引用的引用,没有引用数组,也没有指向引用的指针。

为什么引用数组是非法的?

原文由 Khaled Alshaya 发布,翻译遵循 CC BY-SA 3.0 许可协议

引用实际上并不存在于物理上,直到它们需要具有物理表现(即,作为聚合的成员)。

由于上述原因,拥有一组引用是非法的。但是没有什么能阻止您创建具有引用成员的结构/类数组。

我相信有人会指出提到这一切的标准条款。

原文由 MSN 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题