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

Has*_*dev 3 c++

从我到目前为止所读到的,似乎参考变量根本不应该占用任何内存.相反,它们被视为它们引用的完全相同的变量,但具有另一个名称.

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

12, 40
Run Code Online (Sandbox Code Playgroud)

为什么B比A大得多?

有没有其他方法可以访问,例如Bm [0]与Bx?

Arn*_*rtz 7

从我到目前为止所读到的,似乎参考变量根本不应该占用任何内存.

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

所以你看到的基本上是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
Run Code Online (Sandbox Code Playgroud)

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