面试常考,项目易错!C/C++中的字节对齐( 三 )
3、1
- 语法
- 说明
- pack提供数据声明级别的控制 , 对定义不起作用;
- 调用pack时不指定参数 , n将被设成默认值;
- 一旦改变数据类型的 alignment , 直接效果就是占用 memory 的减少 , 但是 performance 会下降;
- 语法具体分析
- show:可选参数
- push:可选参数
- 【面试常考,项目易错!C/C++中的字节对齐】pop:可选参数
- identifier:可选参数
- n:可选参数
例子
#include
#include
using namespace std;
#pragma pack(4)
struct m
{
int a;
short b;
int c;
};
int main
{
cout <<"结构体m的大小:"<< sizeof(m) << endl;
cout << endl;
// 获得成员a相对于m储存地址的偏移量
int offset_b = offsetof(struct m, a);
cout <<"a相对于m储存地址的偏移量:"<< offset_b << endl;
system("pause");
return 0;
}
文章插图
从运行结果来看我们可以证实上面内存对齐规则的第一条:第一个数据成员放在offset为0的地方 。
现在咱来看看上面结构体是如何内存对齐的;先用代码打印它们每个数据成员的存储地址的偏移量
//编译器:
//来源:技术让梦想更伟大
//作者:李肖遥
#include
#include
using namespace std;
#pragma pack(4)
struct m
{
int a;
short b;
int c;
};
int main
{
cout <<"结构体m的大小:"<< sizeof(m) << endl;
cout << endl;
int offset_b = offsetof(struct m, a);// 获得成员a相对于m储存地址的偏移量
int offset_b1 = offsetof(struct m, b);// 获得成员a相对于m储存地址的偏移量
int offset_b2 = offsetof(struct m, c);// 获得成员a相对于m储存地址的偏移量
cout <<"a相对于m储存地址的偏移量:"<< offset_b << endl;
cout << "b相对于m储存地址的偏移量:" << offset_b1 << endl;
cout << "c相对于m储存地址的偏移量:" << offset_b2 << endl;
//system("pause");
return 0;
}
文章插图
在此c在结构体中偏移量为8加上它自身(int)4个字节 , 刚好是12(c的开始位置为8 , 所以要加它的4个字节)
上面内存结束为11 , 因为0-11 , 12是最大对齐数的整数倍 , 故取其临近的倍数 , 所以就取4的整数倍即12;
上图中我用连续的数组来模仿内存 , 如图是它们的内存对齐图;
如果将最大内存对齐数改为8 , 他将验证内存对齐规则中的第3条 。
如果将其改为2 , 会发生什么:我们来看看:
//编译器:
//来源:技术让梦想更伟大
//作者:李肖遥
#include
#include
using namespace std;
#pragma pack(2)
struct m
{
int a;
short b;
int c;
};
int main
{
- 研发|闽企制伞有“功夫”项目入选国家重点研发计划
- 建设|龙元建设中标中国移动宁波信息通信产业园二期施工项目
- 钢筋|海南国道G360文临公路项目引进钢筋智能“焊”将
- 名单|河南8个项目入选国家级示范名单
- 项目|Yearn帝国正在崛起,有多少DeFi项目开始瑟瑟发抖
- 合并|Andre Cronje主导批量「合并」DeFi项目,是好事情吗?
- 贵阳|捷顺科技(002609.SZ)中标贵阳智慧停车公共信息服务平台系统建设项目
- 建设|日海智能(002313.SZ)中标板障山山地步道项目线路一智慧化建设设计施工总承包项目
- 团队|为什么项目管理非常重要?
- 五金|我院承担的顺德区家居五金国际质量比对项目顺利通过成果验收