不同编译器指针大小不同导致的一个小问题

不同编译器指针大小不同导致的一个小问题,第1张

在使用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 = &num;

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;


引用本身确实是有内容的,保存的也是地址。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/742410.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存