当前位置: 首页 > news >正文

制作装饰公司网站青岛做网站推广

制作装饰公司网站,青岛做网站推广,ps软件下载绘画,淘宝客app开发1.内存对齐的意义 C 内存对齐的主要意义可以简练概括为以下几点: 提高访问效率:内存对齐可以使数据在内存中以更加紧凑的方式存储,从而提高了数据的访问效率。处理器通常能够更快地访问内存中对齐的数据,而不需要额外的字节偏移计…

1.内存对齐的意义

C++ 内存对齐的主要意义可以简练概括为以下几点:

  1. 提高访问效率:内存对齐可以使数据在内存中以更加紧凑的方式存储,从而提高了数据的访问效率。处理器通常能够更快地访问内存中对齐的数据,而不需要额外的字节偏移计算。

  2. 硬件要求:许多硬件平台要求数据按照一定的对齐规则存储,否则可能会导致性能下降或者错误。不符合硬件要求的数据存储方式可能会引发总线错误或性能降低。

  3. 结构体和类的正确性:在C++中,结构体和类中的成员变量通常按照编译器的默认对齐方式进行排列,以确保数据的正确访问和存储。手动调整对齐方式可以保证数据的正确性。

  4. 跨平台开发:内存对齐可以确保数据在不同平台上的一致性。这对于跨平台开发非常重要,因为不同的硬件架构可能有不同的对齐要求。

  5. 节省内存:内存对齐可以减少内存碎片,从而节省内存空间。当数据按照对齐要求存储时,不会出现因为填充字节而浪费内存的情况。

总之,C++ 内存对齐的主要意义在于提高访问效率、符合硬件要求、确保数据的正确性、支持跨平台开发以及节省内存空间。通过遵循对齐规则,可以充分利用硬件的性能优势,并确保程序在不同平台上的可移植性和正确性。

2.对齐原则


原则1 :数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在
offiset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身
长度中,比较小的那个进行。(先偏移到那个对齐标准数的指定倍数,在进行加上本身)
原则2:结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进
行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的
那个进行。
原则3 :结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元
素大小的整数倍地址开始存储。

3.默认对齐值

默认对齐值:
Linux默认#pragma pack(4)
window默认#pragma pack(8)
注:可以通过预编译命令#pragma pack(n) , n=1,2,4,8,16来改变这一系数,其中的n就是指定
的“对齐系数”。

例题1:

#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(1)
using namespace std;struct AA
{int a;   //长度4>1 按照1对齐,偏移量为0,存放位置区间[0,3]char b;  //长度1==1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2>1,按1对齐,偏移量提升到2的 倍数6,存放位置区间[5,6]char d;  //长度1==1,按1 对齐,偏移量为6,存放位置区间[7]//整体存放【0-7】 位置中,共八个字节。
};int main()
{cout << sizeof(AA) << endl;system("pause");return 0;
}


#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(2)
using namespace std;struct AA
{int a;   //长度4>1 按照1对齐,偏移量为0,存放位置区间[0,3]char b;  //长度1==1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2>1,按1对齐,偏移量,存放位置区间[5,6]char d;  //长度1==1,按1 对齐,偏移量为6,存放位置区间[7]//整体存放【0-7】 位置中,共八个字节。
};struct BB
{// BB 是注释掉以上 内容 按照2个字节对齐的情况int a;   //长度4>2 按照2对齐,偏移量为0,存放位置区间[0,3]char b;  //长度2>1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2=1,按2对齐,整体偏移到2的倍数6,存放位置区间[6,7]char d;  //长度2>1,按1对齐,偏移量为7,存放位置区间[8],共9个字节。//整体存放【0-8】 位置中,共9个字节。
};int main()
{// cout << sizeof(AA) << endl;cout << sizeof(BB) << endl;system("pause");return 0;
}

  

 

#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(4)
using namespace std;struct AA
{int a;   //长度4>1 按照1对齐,偏移量为0,存放位置区间[0,3]char b;  //长度1==1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2>1,按1对齐,偏移量,存放位置区间[5,6]char d;  //长度1==1,按1 对齐,偏移量为6,存放位置区间[7]//整体存放【0-7】 位置中,共八个字节。
};struct BB
{// BB 是注释掉以上 内容 按照2个字节对齐的情况int a;   //长度4>2 按照2对齐,偏移量为0,存放位置区间[0,3]char b;  //长度2>1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2=1,按2对齐,整体偏移到2的倍数6,存放位置区间[6,7]char d;  //长度2>1,按1对齐,偏移量为7,存放位置区间[8],共9个字节。//整体存放【0-8】 位置中,共9个字节。
};struct CC
{int a;   //长度4=4 按照4对齐,偏移量为0,存放位置区间[0,3]char b;  //长度4>1 按照1对齐,偏移量为4,存放区间[4]short c; //长度 2<4 按照两个字节对齐,对齐到2的倍数6 存放位置{6,7}char d;  // 1<4 ,按照1 对齐。偏移量为7.存放位置的区间为[8],总大小为9
};int main()
{// cout << sizeof(AA) << endl;// cout << sizeof(BB) << endl;cout << sizeof(CC) << endl;system("pause");return 0;
}

 

8字节对齐

#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(8)
using namespace std;struct AA
{int a;   //长度4>1 按照1对齐,偏移量为0,存放位置区间[0,3]char b;  //长度1==1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2>1,按1对齐,偏移量,存放位置区间[5,6]char d;  //长度1==1,按1 对齐,偏移量为6,存放位置区间[7]//整体存放【0-7】 位置中,共八个字节。
};struct BB
{// BB 是注释掉以上 内容 按照2个字节对齐的情况int a;   //长度4>2 按照2对齐,偏移量为0,存放位置区间[0,3]char b;  //长度2>1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2=1,按2对齐,整体偏移到2的倍数6,存放位置区间[6,7]char d;  //长度2>1,按1对齐,偏移量为7,存放位置区间[8],共9个字节。//整体存放【0-8】 位置中,共9个字节。
};struct CC
{int a;   //长度4=4 按照4对齐,偏移量为0,存放位置区间[0,3]char b;  //长度4>1 按照1对齐,偏移量为4,存放区间[4]short c; //长度 2<4 按照两个字节对齐,对齐到2的倍数6 存放位置{6,7}char d;  // 1<4 ,按照1 对齐。偏移量为7.存放位置的区间为[8],总大小为9
};struct DD
{int a;   // 4<8  按4对齐, 偏移:0 位置 {0,3}char b;  // 1<8 按1对齐 偏移:4 位置:{4}short c; // 2<8 按照2 对齐 偏移 6  位置 {6,7}char d;  // 1<8  按照1 对齐 偏移为7 位置[8] 总大小为9
};int main()
{// cout << sizeof(AA) << endl;// cout << sizeof(BB) << endl;// cout << sizeof(CC) << endl;cout << sizeof(DD) << endl;system("pause");return 0;
}

#按照8位,有 包含 double的情况。

#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(8)
#include <stddef.h>
using namespace std;struct AA
{int a;   //长度4>1 按照1对齐,偏移量为0,存放位置区间[0,3]char b;  //长度1==1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2>1,按1对齐,偏移量,存放位置区间[5,6]char d;  //长度1==1,按1 对齐,偏移量为6,存放位置区间[7]//整体存放【0-7】 位置中,共八个字节。
};struct BB
{// BB 是注释掉以上 内容 按照2个字节对齐的情况int a;   //长度4>2 按照2对齐,偏移量为0,存放位置区间[0,3]char b;  //长度2>1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2=1,按2对齐,整体偏移到2的倍数6,存放位置区间[6,7]char d;  //长度2>1,按1对齐,偏移量为7,存放位置区间[8],共9个字节。//整体存放【0-8】 位置中,共9个字节。
};struct CC
{int a;   //长度4=4 按照4对齐,偏移量为0,存放位置区间[0,3]char b;  //长度4>1 按照1对齐,偏移量为4,存放区间[4]short c; //长度 2<4 按照两个字节对齐,对齐到2的倍数6 存放位置{6,7}char d;  // 1<4 ,按照1 对齐。偏移量为7.存放位置的区间为[8],总大小为9
};struct DD
{int a;   // 4<8  按4对齐, 偏移:0 位置 {0,3}char b;  // 1<8 按1对齐 偏移:4 位置:{4}short c; // 2<8 按照2 对齐 偏移 6  位置 {6,7}char d;  // 1<8  按照1 对齐 偏移为7 位置[8] 总大小为9
};struct EE
{int a;    // 4<8  按4对齐, 偏移:0 位置 {0,3}double b; // 8==8 按8对齐 偏移量偏移到8的倍数 偏移8 位置:{8,16}short c;  // 2<8 按照2 对齐 偏移 16  位置 {16,17}char d;   // 1<8  按照1 对齐 偏移为17 位置[18] 总大小为9
};int main()
{// cout << sizeof(AA) << endl;// cout << sizeof(BB) << endl;// cout << sizeof(CC) << endl;// cout << sizeof(DD) << endl;cout << sizeof(EE) << endl;cout << offsetof(EE, b) << endl; //查看偏移了多少内存。system("pause");return 0;
}

 例四:结构体包含结构体的运算。

#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(8)
#include <stddef.h>
using namespace std;struct AA
{int a;   //长度4>1 按照1对齐,偏移量为0,存放位置区间[0,3]char b;  //长度1==1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2>1,按1对齐,偏移量,存放位置区间[5,6]char d;  //长度1==1,按1 对齐,偏移量为6,存放位置区间[7]//整体存放【0-7】 位置中,共八个字节。
};struct BB
{// BB 是注释掉以上 内容 按照2个字节对齐的情况int a;   //长度4>2 按照2对齐,偏移量为0,存放位置区间[0,3]char b;  //长度2>1 按1 对齐,偏移量为4,存放位置区间[4]short c; //长度2=1,按2对齐,整体偏移到2的倍数6,存放位置区间[6,7]char d;  //长度2>1,按1对齐,偏移量为7,存放位置区间[8],共9个字节。//整体存放【0-8】 位置中,共9个字节。
};struct CC
{int a;   //长度4=4 按照4对齐,偏移量为0,存放位置区间[0,3]char b;  //长度4>1 按照1对齐,偏移量为4,存放区间[4]short c; //长度 2<4 按照两个字节对齐,对齐到2的倍数6 存放位置{6,7}char d;  // 1<4 ,按照1 对齐。偏移量为7.存放位置的区间为[8],总大小为9
};struct DD
{int a;   // 4<8  按4对齐, 偏移:0 位置 {0,3}char b;  // 1<8 按1对齐 偏移:4 位置:{4}short c; // 2<8 按照2 对齐 偏移 6  位置 {6,7}char d;  // 1<8  按照1 对齐 偏移为7 位置[8] 总大小为9
};struct EE
{int a;    // 4<8  按4对齐, 偏移:0 位置 {0,3}double b; // 8==8 按8对齐 偏移量偏移到8的倍数 偏移8 位置:{8,16}short c;  // 2<8 按照2 对齐 偏移 16  位置 {16,17}char d;   // 1<8  按照1 对齐 偏移为17 位置[18] 总大小为9
};//=============================================================
struct GG
{//结构体内部最大元素为int.由于偏移量8刚好是4 的倍数,所以从8 开始存放struct 对应了规则三。int a1;   // 4<8   4  8   [8,11]char b1;  // 1<8  1  12  [12]short c1; // 2<8   2  14  [14,15]char d1;  // 1 <8   1  16  [16]
};
struct FF
{int a;   // 4<8 按4   偏移0 存放的位置【0,3】char b;  // 1<8 按1   偏移4           [4]short c; // 2<8  2      6            [6,7]GG g;//子strcut整体对齐系数=min((max(int,short,char),8))=4. 将内存补齐到4 的整数倍 20.char d; // 1<8  1   21  21//整体对齐系数 4 所有有21 补到24.
};
//===========================================
int main()
{// cout << sizeof(AA) << endl;// cout << sizeof(BB) << endl;// cout << sizeof(CC) << endl;// cout << sizeof(DD) << endl;// cout << sizeof(EE) << endl;// cout << offsetof(EE, b) << endl; //查看偏移了多少内存。cout << sizeof(FF) << endl;// cout << offsetof(FF, GG) << endl;system("pause");return 0;
}

 

 

 4.练习:

        

#include <iostream>
#include <vector>
#include <algorithm>
#pragma pack(8)
using namespace std;struct A
{int a; // [0,4]double b;// [ 8, 16 ]float c;// [ 17, 20 ]
};
// #24struct B
{char e[2]; // 1<8 按照2对齐  偏移 0  位置【0,1】short h;   // 2<8 2             2       [2,4]A a; // 24// 一共28 偏移一起达到32.
};int main()
{cout << sizeof(B) << endl;system("pause");return 0;
}

 

 

http://www.dinnco.com/news/52119.html

相关文章:

  • 网站开发报价单.doc成都网站设计
  • 营业执照年审怎么年审关键词优化seo优化
  • jsp做网站前端实例网络营销策划方案怎么做
  • 长沙网站开发微联讯点不错培训教育
  • 成都做网站开发的公司高质量外链
  • 开服网站源码关键词优化百家号
  • 正规网站模板设计搜索网
  • 中小企业网站建设费用软文网站模板
  • 叫别人建个网站多少钱友情链接还有用吗
  • 多语种网站开发沈阳seo关键词排名
  • 网站建设哪家好友情链接多久有效果
  • 做科技汽车的视频网站有哪些内容企业培训课程体系
  • 黄金网站app在线观看下载10广告公司收费价格表
  • wordpress 漂亮主题湛江seo
  • 中国最新消息新冠疫苗最新消息简述什么是seo
  • 做网站首页需要什么资料武汉百度快照优化排名
  • wordpress版权信息济南seo优化公司助力排名
  • wordpress创建小工具关键词优化排名软件案例
  • 基于MVC网站建设课程设计报告佛山外贸seo
  • ssh网站开发seo超级外链发布
  • 网站开发收费标准文档最吸引人的营销广告词
  • 北京网站建设小程序开发广州市疫情最新情况
  • 网站上传连接失败的原因上海市人大常委会
  • 如何直到网站是用什么模板做的国外网站加速
  • 做网页推广的网站哈尔滨seo关键词排名
  • 网站办公室文化建设重庆seo网站系统
  • 做微商哪个网站比较好关键词优化是怎么弄的
  • 衡水哪儿做网站便宜关键词seo公司
  • jsp和.net做网站的区别2022年最新新闻播报稿件
  • 提高网站流量襄阳网站推广优化技巧