在使用dev class="superseo">c++学习C++引用时,输入以下学习程序时:
#include
#include
using namespace std;
int num = 99;
class A{
public:
A();
private:
int n;
int &r;
};
A::A():n(0),r(num){
}
int main(){
class A *a = new A;
cout << sizeof(A) << endl;
cout <<hex << showbase << *((int *)a + 1) << endl;
cout << &num << endl;
return 0;
}
按照教程以及常理,16数字下输出的两行地址应为一致,但结果并非如此:
分别打印对象a和强制转换为整型后的地址发现是一致的:
cout << a << endl;
cout << (int *)a << endl;
但是加1想获取强制获取引用 r 的地址时发现有不同,两者地址只相差4:
cout << a << endl;
cout << (int *)a + 1<< endl;
而类A的大小为16,所以按照常理,加1地址应该增加8。所以判断问题应该有两点:1、是不同编译器对int和指针大小的不同。2、是因为类内部的内存对齐问题。目前的dev C++的编译器为:
同时,根据linux64位系统中指针占用8字节,而int只占用4字节,基本可以确定问题所在。验证一下:
首先确认各数据类型大小:
int num = 99;
int *pointer = #
cout << "int :" << sizeof(int) << endl;
cout << "long:" << sizeof(long) << endl;
cout << "long long:" << sizeof(long long) << endl;
cout << "pointer:" << sizeof(pointer) << endl;
可以看到确如猜想,且因为内存对齐,int虽只占4字节,但是整个类A的大小为16。所以程序中应做如下修改即可得到正常现象:
cout <<hex << showbase << *((long long *)a + 1) << endl;
引用本身确实是有内容的,保存的也是地址。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)