博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
结构体和类内存分配
阅读量:5955 次
发布时间:2019-06-19

本文共 1319 字,大约阅读时间需要 4 分钟。

  hot3.png

在默认情况下,为了方便对结构体和类中数据元素的访问和管理,当结构体或类内的数据元素的长度都小于机器字长时,就以结构体或类中最长的数据元素为对齐单位。也就是说,结构体或类的长度一定是最长数据元素的整数倍。如果结构体或类内存在长度大于机器字长的数据元素,那么就以机器的字长为对齐单位。结构体或类中类型相同的连续元素将在连续的空间,和数组保持一致。

例如:(机器字长为32位)

struct{
      short a1;
      short a2;
      short a3;
}A;
class B
{
public:
      int a;
      static int b;
      
      B();
      ~B();
};
struct{
      float a;
      int b;
      char c;
}C;
求sizeof(A),sizeof(B),sizeof(C);
对于A,short类型变量占2个字节,因此sizeof(A)为6;对于B,静态变量是存放在全局数据区的,而sizeof计算栈中分配的大小,因此sizeof(B)为4;对于C,考虑到数据对齐,float大小为4,int大小为4,char大小为1,因此sizeof(C)为12。
原理:为了提高CPU的存储速度,VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。 
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。

struct 

{
   char dda;
   double dda1; 
   float dd; 
}A;

int main()

{
   cout<<sizeof(A)<<endl;
   return 0;
}

char占1个字节,double占8个字节,float占4个字节,因此结构体对齐默认按8字节对齐。sizeof(A)=1+(7)+8+4+(4)=24.其中,括号中的数字都是VC自动填充的字节数。

另外,需要补充的是,如果是嵌套类(结构体),则使用上面的规则时,地址对齐时,依据的是嵌套类所拥有的数据成员里占用空间类型最大的类型,而不是考虑整个嵌套类。

class ab
{
   char *pa;
   void get_ia();
   struct cd
   {
     double da;
      int ib;
    }abc;
};
这时,sizeof(ab)=4+(4)+8+4+(4)=24.

在默认情况下,为了方便对结构体和类中数据元素的访问和管理,当结构体或类内的数据元素的长度都小于机器字长时,就以结构体或类中最长的数据元素为对齐单位。也就是说,结构体或类的长度一定是最长数据元素的整数倍。如果结构体或类内存在长度大于机器字长的数据元素,那么就以机器的字长为对齐单位。结构体或类中类型相同的连续元素将在连续的空间,和数组保持一致。

转载于:https://my.oschina.net/stlwtr/blog/82438

你可能感兴趣的文章
Atom 编辑器系列视频课程
查看>>
C#三种定时器
查看>>
范数 L1 L2
查看>>
协同过滤及大数据处理
查看>>
Java8 本地DateTime API
查看>>
jQuery 增加 删除 修改select option
查看>>
[原][osgearth]osgearthviewer读取earth文件,代码解析(earth文件读取的一帧)
查看>>
springboot 常用插件
查看>>
一个基于特征向量的近似网页去重算法——term用SVM人工提取训练,基于term的特征向量,倒排索引查询相似文档,同时利用cos计算相似度...
查看>>
[转]Newtonsoft.Json高级用法
查看>>
Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简述及技术选型介绍
查看>>
DFI、DPI技术
查看>>
hibernate 执行存储过程 方法
查看>>
RapidIOIP核的验证方法研究_王玉欢
查看>>
崩溃日志的实例
查看>>
base64是啥原理
查看>>
字符串中去除连续相同的字符保留一个
查看>>
实战 Windows Server 2012 群集共享卷
查看>>
CSS 元素超出部分滚动, 并隐藏滚动条
查看>>
React中那些纠结你的地方(一)
查看>>