(转)VC 字节对齐
见到N多的笔试题目考到相关内容,作题目时老是非常迷糊,索性一怒,狂看,终于有所得。
在这做个总结:
一、VC默认方式的字节对齐:
1.数据成员对齐规则:
在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量:sizeof(类型)或其倍数
2.整体对齐规则:
结构的总大小也有个约束条件:最大sizeof(类型)的整数倍
如:struct MyStruct
{
char dda;
double dda1;
int type
};//sizeof=1+7+8+4+4=24
二、自己设定字节对齐方式
VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。
1.数据成员对齐规则:
n字节对齐就是说变量存放的起始地址的偏移量:min(sizeof(类型),对齐方式)或其倍数.
2.整体对齐规则:
结构的总大小也有个约束条件:min(最大的sizeof(类型),对齐方式)的倍数.
#pragma pack(push) //保存对齐状态
#pragma pack(4)//设定为4字节对齐
struct test
{
char m1; //默认偏移量
double m4;//非默认偏移量
int m3; //默认偏移量
}; //sizeof=1+3+8+4=16应为4的倍数
#pragma pack(pop)//恢复对齐状态
#pragma pack(push) //保存对齐状态
#pragma pack(16)//设定为4字节对齐
struct test
{
char m1;//默认偏移量
double m4;//默认偏移量
int m3;//默认偏移量
}; //sizeof=1+7+8+4+4=24应为8的倍数。
#pragma pack(pop)//恢复对齐状态
三、sizeof简单应用
1. 参数为数据类型或者为一般变量。
例如sizeof(int),sizeof(long)等等。
这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。例如int类型在16位系统中占2个字节,在32位系统中占4个字节。
2. 参数为数组或指针。下面举例说明.
int a[50]; //sizeof(a)=4*50=200; 求数组所占的空间大小
int *a=new int[50];// sizeof(a)=4; a为一个指针,sizeof(a)是求指针的大小,在32位系统中,当然是占4个字节。
3. 参数为结构或类。
Sizeof应用在类和结构的处理情况是相同的。
但有两点需要注意,第一、结构或者类中的静态成员不对结构或者类的大小产生影响,因为静态变量的存储位置与结构或者类的实例地址无关。
第二、没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存中都有唯一的地址。
下面举例说明,
Class Test{int a;static double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,s为一个指针。
Class test1{ };//sizeof(test1)=1;
4. 参数为其他。下面举例说明。
int func(char s[5]);
{
cout<<sizeof(s);
//这里将输出4,本来s为一个数组,但由于做为函数的参数在传递的时候系统处理为一个指针,所以sizeof(s)实际上为求指针的大小。
return 1;
}
sizeof(func(“1234”))=4//因为func的返回类型为int,所以相当于//求sizeof(int).
四、sizeof(含位域的结构体)
使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
测试:
struct test
{
char a:1;
char :2;
long b:3;
char c:2;
};
test t1;
int len=sizeof(t1); //len=1+3+4+1+3=12
struct test
{
char a:1;
char :2;
char b:3;
long c:2;
};
test t1;
int len=sizeof(t1); //len=1+3+4=8
struct test
{
char a:1;
char :2;
char b:3;
char c:2;
};
test t1;
int len=sizeof(t1); //len=1
转自:清平乐--百度空间
http://hi.baidu.com/gaomanyi/blog/item/9cf279638b96cb660d33fad0.html
转载于:https://www.cnblogs.com/JarvisChu/archive/2011/05/12/2752486.html
(转)VC 字节对齐相关推荐
- java字节对齐 32 64_【C语言】字节对齐问题(以32位系统为例)
1. 什么是对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型 ...
- mysql字节对齐_结构体字节对齐-位域及其对齐
字节对齐的准则:其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2) 结构体每个成员相对于结构体首地址的偏移量都是成 ...
- 结构体字节对齐(转)
结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是 ...
- c++内存中字节对齐问题详解
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这 ...
- 更改结构体的内存字节对齐方式--经典
结构体字节对齐 http://blog.163.com/ecy_fu/blog/static/4445126200910603739941/ http://hi.baidu.com/skyland_l ...
- c++ 结构体地址 转换成ulong_零基础入门之结构体字节对齐
一.字节对齐的规则: 1.一般设置的对齐方式为1,2,4字节对齐方式.结构的首地址必须是结构内最宽类型的整数倍地址;另外,结构体的每一个成员起始地址必须是自身类型大小的整数倍(需要特别注意的是wind ...
- 【C语言】字节对齐问题(以32位系统为例)
1. 什么是对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型 ...
- 仔细讨论 C/C++ 字节对齐问题⭐⭐
原文:https://www.cnblogs.com/AlexMiller/p/5509609.html 字节对齐的原因 为了提高 CPU 的存储速度,编译器会对 struct 和 union的存储进 ...
- 快速弄懂内存字节对齐
字节对齐有三原则: 1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员 ...
最新文章
- F5负载均衡的双机冗余配置与全冗余解析
- CSP认证201512-1	数位之和[C++题解]:模拟、水题
- 常用的Homebrew的命令的使用
- CSS基本布局16例(原网页引自Owen Briggs)
- Ubuntu on Windows,在Windows上的Ubuntu
- caffe手写数字识别-训练模型
- VMware虚拟机中Linux系统如何修改IP地址
- bzoj1597: [Usaco2008 Mar]土地购买
- oracle 客户端的安装失败,关于安装oracle 11g client 出现安装先决条件检查全部失败...
- Defect Analysis
- 西电上机题——P378-正整数的最优分解
- 微软office与WPS Office如此相似,微软为什么不告金山侵权呢?
- 四川大学计算机学院软件工程期末,2015四川大学软件工程期末复习.doc
- 2022中国消费者洞察
- java web 图片上传
- ExtJS 表格自定义列-动态widget
- 小情侣冷战到半夜!不料程序员男友一波“神操作”巧妙化解,女友懵了.........
- Greenpois0n绿毒越狱越狱教程(Iphone4版本)
- 脚本 | 获取windows安装软件列表
- NEO(小蚁币)白皮书中文版
热门文章
- 报表session与应用session常识普及
- 深入浅出 数据库索引
- 钉钉小程序使用vant_高效钉钉小程序开发丨详解Hello,dingtalk
- javascript代码_15个最好用的JavaScript代码压缩工具
- vite创建vue3,8月版本
- python类的应用_如何剖析python应用程序的类方法?
- 批处理 无效驱动器规格_电脑维修之硬盘驱动器的常见故障判断
- libxml2如何配合php使用,libxml2实现xml文档的节点的修改
- 年轻人应该做的和不该做的
- AcWing285. 没有上司的舞会(树形DP)题解