31 位域、空类的sizeof值

1 分析下列程序:

#include<iostream>
using namespace std;
struct s
{
int x: 3;
int y: 4;
int z: 5;
double a;
};
int main() {
cout<<sizeof(s)<<endl;
return 0;
}

  求sizeof(s)的结果为 16.

分析:看清楚结构体中是位操作,三个变量共占用一个int 类型的大小,int 类型占用4个字节,double占用8个字节,为实现内存对齐,int类型需要填充4个字节的长度。

x,y,z分别占用3,4,5位,int是4个字节32位,相当于xyz占用4个字节,double占8个字节,按照对齐原则,前面补4位,4+4+8=16.有一个条件是默认8字节对齐,如果前面加上一句#pragma pack(4)//设定为4字节对齐,结果就是12.

C结构体之位域(位段)

windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为:1、

#include<iostream>
using namespace std;
class A
{
};
int main() {
	cout<<sizeof(A)<<endl;
	return 0;
}

分析:C++对空类或者空结构体,对其sizeof操作时候,默认都是1个字节。如果类为空,结果是1.

#include<iostream>
using namespace std;
class A
{
	char b[0];
};
int main() {
	cout<<sizeof(A)<<endl;
	return 0;
}

 如果在类中定义了变量,那就是变量size,char b[0]长为0,所以大小为0

类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二地址。同样空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就会有独一无二地址。所以空类的sizeof为1,而不是0.多重继承的空类大小也是1.

 

 

C++学习(13)

拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
原文地址:https://www.cnblogs.com/dd2hm/p/7462128.html