加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:33:17 所属栏目:百科 来源:网络整理
导读:从我到目前为止所读到的,似乎参考变量根本不应该占用任何内存.相反,它们被视为它们引用的完全相同的变量,但具有另一个名称. 但是,当我运行以下代码时,似乎并非总是如此: #include cstdiostruct A{ int m[3];};struct B: A{ B():x(m[0]),y(m[1]),z(m[2]){} i
从我到目前为止所读到的,似乎参考变量根本不应该占用任何内存.相反,它们被视为它们引用的完全相同的变量,但具有另一个名称.

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

#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,%un",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中是公共的并且是公开继承的.在没有您遇到的参考开销的情况下给它另一个名称是不可能的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读