sizeof总结

1、基本数据类型

cout << sizeof(char);           // 结果是1
cout << sizeof(int);            // 结果是4
cout << sizeof(unsigned int);   // 结果是4 
cout << sizeof(long int);       // 结果是4
cout << sizeof(short int);      // 结果是2
cout << sizeof(float);          // 结果是4
cout << sizeof(double);         // 结果是8

2、数组的sizeof数组的sizeof值等于数组所占用的内存字节数

char c[] = "hello";
int a[3];
sizeof( c ); // 结果为6,字符末尾还存在一个NULL终止符
sizeof( a ); // 结果为3*4=12

3、操作数是联合类型时,sizeof是其最大字节成员的字节数

union  un  
{  
     char c;  
     int a;  
}U;  

sizeof(U) = max(sizeof(c),sizeof(a)) = sizeof(1,4) = 4;  

4、 sizeof结构体的内存对齐问题

struct poll{
    char a;
    int b;
    short c;
};
sizeof(poll);    //大小为12

struct m_s{
    double a;
    int b;
    char c;
};
sizeof(m_s);    //大小为16

5、#pragma pack()的用法
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。

2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。

二字节对齐:

#include <stdio.h>
#pragma pack(2)
typedef struct
{
  int aa1; //2个字节对齐 11 11
  char bb1;//1个字节对齐 1
  short cc1;//2个字节对齐 011
  char dd1; //1个字节对齐 1
  } test;
int length = sizeof(test); //2个字节对齐,占用字节11 11 10 11 10,length = 10

四字节对齐:

#include <stdio.h>
#pragma pack(4)
typedef struct
{
  int aa1; //4个字节对齐 1111
  char bb1;//1个字节对齐 1
  short cc1;//2个字节对齐 011
  char dd1; //1个字节对齐 1
  } test;
int length = sizeof(test); //2个字节对齐,占用字节1111 1011 1000,length = 12

6、类
空类是会占用内存空间的,而且大小是1,原因是C++要求每个实例在内存中都有独一无二的地址。
(一)类内部的成员变量:

  • 普通的变量:是要占用内存的,但是要注意对齐原则(这点和struct类型很相似)。
  • static修饰的静态变量:不占用内容,原因是编译器将其放在全局变量区。

(二)类内部的成员函数:

  • 普通函数:不占用内存。
  • 虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。所以一个类的虚函数所占用的地址是不变的,和虚函数的个数是没有关系的
class cBase{};
sizeof(cBase);   //大小为1
#pragma pack(4)  
class CBase1  
{  
private:  
    char c;  
    short sh;  
    int a;  
public:  
    void fOut(){ cout << "hello" << endl; }  
}; 

sizeof(CBase1);   //大小为8,如果有虚函数,则大小增加4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值