c – 派生类比基类大,即使它由引用变量组成

c – 派生类比基类大,即使它由引用变量组成,第1张

概述从我到目前为止所读到的,似乎参考变量根本不应该占用任何内存.相反,它们被视为它们引用的完全相同的变量,但具有另一个名称. 但是,当我运行以下代码时,似乎并非总是如此: #include <cstdio>struct A{ int m[3];};struct B: A{ B():x(m[0]), y(m[1]), z(m[2]){} int& x; int& 从我到目前为止所读到的,似乎参考变量根本不应该占用任何内存.相反,它们被视为它们引用的完全相同的变量,但具有另一个名称.

但是,当我运行以下代码时,似乎并非总是如此:

#include <cstdio>struct A{    int m[3];};struct B: A{    B():x(m[0]),y(m[1]),z(m[2]){}    int& x;    int& y;    int& z;};int main(){    printf("%u,%u\n",sizeof(A),sizeof(B));    return 0;}

输出:

12,40

为什么B比A大得多?

有没有其他方法可以访问,例如B.m [0]与B.x?

解决方法

From what I’ve read so far,it seems that reference variables are not supposed to take any memory at all.

你应该进一步阅读;)
说真的,引用并不神奇.所以在现实世界中,对象必须以某种方式存储关于引用绑定到哪个对象的信息.因此,从概念上讲,引用没有大小,它实际上非常像指针,通常编译器只使用指针.与编译器不同的行为(非空,不可重新分配,无需取消引用)由编译器在编译时强制执行.

所以你看到的基本上是A plus padding的大小加上三个指针的大小.我猜你是64位系统,其中sizeof(int)是4而sizeof(voID *)是8:

12 bytes for the A subobject (4 for each int)+ 4 bytes padding (to get to a multiple of 8 bytes)+24 bytes for the 3 references/pointers in B (8 for each one)-------------- 40 bytes total

对于您的其他问题,给定B类型的对象b,您可以直接访问b.m [0],因为它在A中是公共的并且是公开继承的.在没有您遇到的参考开销的情况下给它另一个名称是不可能的.

总结

以上是内存溢出为你收集整理的c – 派生类比基类大,即使它由引用变量组成全部内容,希望文章能够帮你解决c – 派生类比基类大,即使它由引用变量组成所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1221045.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存