从我到目前为止所读到的,似乎参考变量根本不应该占用任何内存.相反,它们被视为它们引用的完全相同的变量,但具有另一个名称.
但是,当我运行以下代码时,似乎并非总是如此:
#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?
从我到目前为止所读到的,似乎参考变量根本不应该占用任何内存.
你应该进一步阅读;)说真的,引用不是魔术.所以在现实世界中,对象必须以某种方式存储关于引用绑定到哪个对象的信息.因此,从概念上讲,引用没有大小,它实际上非常像指针,通常编译器只使用指针.与编译器不同的行为(非空,不可重新分配,无需取消引用)由编译器在编译时强制执行.
所以你看到的基本上是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并且是公开继承的.在没有您遇到的参考开销的情况下给它另一个名称是不可能的.