但是,当我运行以下代码时,似乎并非总是如此:
#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 – 派生类比基类大,即使它由引用变量组成所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)