sizeof与内存对齐

来源:互联网 发布:c语言计算闰年switch 编辑:程序博客网 时间:2024/06/05 14:20

sizeof

内存对齐三原则:

  1. 第一个数据从0开始,以后每个数据要从他本身大小的整数倍开始存;
  2. 如果这个数据是个结构体或者数组,则从其最大元素的整数倍开始存;
  3. 最后收尾要是最大成员的整数倍,不足补齐;
对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)  Char  偏移量必须为sizeof(char)即1的倍数  int   偏移量必须为sizeof(int)即4的倍数  float  偏移量必须为sizeof(float)即4的倍数  double  偏移量必须为sizeof(double)即8的倍数  Short  偏移量必须为sizeof(short)即2的倍数
typedef struct bb{ int id;             //[0]....[3] double weight;      //[8].....[15]      原则1 float height;      //[16]..[19],总长要为8的整数倍,补齐[20]...[23]     原则3}BB;typedef struct aa{ char name[2];     //[0],[1] int  id;          //[4]...[7]          原则1 double score;     //[8]....[15]     short grade;      //[16],[17]         BB b;             //[24]......[47]          原则2}AA;

sizeof结果分别是24和48

加入#pragma pack
加上#pragma pack(n)后,对齐时就选择n和数据大小两者中最小的那个作为对齐的规则,条件三也不需要了。

sizeof与strlen的区别

int h = sizeof("abcde");int t = strlen("abcde");

其中,h为6,t为5.

sizeof计算字符串与指针

string s = "hellohwc";  char * s1 = "hellohwc";  char s2[] = "hellohwc";  char s3[100];  char* s4=(char*)malloc(100);  void *s5=(void*)malloc(100);  cout<<sizeof(s)<<endl;  cout<<sizeof(s1)<<endl;  cout<<sizeof(s2)<<endl;  cout<<sizeof(s3)<<endl;  cout<<sizeof(s4)<<endl;  cout<<sizeof(s5)<<endl;  return 0; 

输出:32(?)、4、9、100、4、4

  • 对于s1是指向字符串常量的指针,在32位机器上指针是4个字节,因此输出为4;
  • 对于s2是一个数组名,数组名做参数本应该作为指针来处理,但是sizeof和&是特殊情况,sizeof对数组名而言,返回整个数组的长度,因此输出为9,为9是因为8个字符加上一个空字符;
  • s3和s2分析方法相同,输出为100;
  • s4和s5都是指针,不管是什么类型的指针,都是保存了一个地址,在32位的机器上,4GB的寻址空间需要32位,也就是4个字节来保存,因此s4和s5输出都是4

sizeof计算类

#include "stdafx.h"  #include <iostream>  #include <string>  using namespace std;  class emptyClass1{  public:      emptyClass1(){}      ~emptyClass1(){}  };  class emptyClass2{  public:      emptyClass2(){}      virtual ~emptyClass2(){}  };  class hwcBase{  public:      hwcBase(){}      virtual  ~hwcBase(){}  private:      int base;  };  class hwcSubFirst:hwcBase{  public:      hwcSubFirst():hwcBase(){}      ~hwcSubFirst(){}  private:      int sub;  };  class hwcSubSecond:hwcBase{  public:      hwcSubSecond():hwcBase(){}      ~hwcSubSecond(){}  private:      int sub;      char sub2;  };  int _tmain(int argc, _TCHAR* argv[])  {      cout<<sizeof(emptyClass1)<<endl;      cout<<sizeof(emptyClass2)<<endl;      cout<<sizeof(hwcBase)<<endl;      cout<<sizeof(hwcSubFirst)<<endl;      cout<<sizeof(hwcSubSecond)<<endl;      return 0;  } 

输出:1、4、8、12、16

sizeof中的表达式不会被计算

int i;i = 10;printf("%d\n", i);printf("%d\n", sizeof(i++));printf("%d\n", i);

输出结果为10,4,10

0 0
原创粉丝点击