紧缩对齐(#pragma pack(n))专题分析

紧缩对齐(#pragma pack(n))专题分析
紧缩对齐(#pragma pack(n))专题分析

第15道题测试紧缩对齐(packing alignment)概念,其中【1】和【3】12字节;【2】9字节;大多数人都误解了所有的成员都是以#pragma pack (n)字节对齐,其默认对齐也不是两个字节,干建的文章分析的不是很正确,其实对齐的规则是,每个成员按其类型的对齐参数(这个类型的大小)和指定对齐参数(#pragma pack (n))中较小的一个对齐,并且结构的长度必须为结构成员中最长长度的整数倍,不够就补空字节(其中n可以为1, 2, 4, 8,或者16),总体上分两步走就可以计算出结构的长度;

这里有四点很重要:

1.每个成员分别按自己的方式对齐,并能最小化长度

2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度.

3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐

4.不论类型是什么,对齐的边界一定是1,2,4,8,16,32,64..….中一个的整数倍.

下面先从例子和C编译器对结构空间缺省的分配入手,最后分析上述试题;下面所有分析是基于32位的CPU;int为4个字节,short为两个字节,long为4个字节,double为8个字节.

例子[1]:

#pragma pack(4)

typedef struct

{

int aa;

char a;

short b;

char c;

}CPerf4;

#pragma pack(2)

typedef struct

{

char a;

short b;

char c;

}CPerf5;

sizeof(CPerf4)结果为12,CPerf5去掉第一个成员变量, sizeof(CPerf5)为6

#pragma pack规定的对齐长度,实际可以使用规则分两步走:

◆[1] 结构,联合,或者C++中类的数据成员,第一个数据成员放在偏移为0的地方,以

后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中最小的那个进行。也就是说,当的值等于或超过所有数据成员长度的时候,这个#pragma pack(n)值的大小将不产生任何效果。

◆[2] 结构整体的对齐,则按照结构体中最大的数据成员和#pragma pack指定值之间

最小的那个进行。

具体解释如下: #pragma pack(4) typedef struct {

int aa; /*第一个成员,放在[0,3]偏移的位置*/

char a;/*第二个成员,自身长为1,#pragma pack(4),取小值,也就是1,所以

这个成员按一字节对齐,放在偏移[4]的位置*/

short b;/*第三个成员,自身长2,#pragma pack(4),取2,按2字节对齐,所

以放在偏[6,7]的位置*/

char c; /*第四个,自身长为1,放在[8]的位置*/ }CPerf4;

内存布局示意图(白色框为填充字节)

偏移量

1 2 3 4 5 6 7 8 9 10 11

这个结构实际占据的内存空间是9字节,结构之间的对齐,是按照结构内部最大的成员的长度,和#pragma pack 规定的值之中较小的一个对齐的。所以这个例子中,结构之间对齐的长度是min(sizeof(int),4),也就是4; 9按照4字节对齐(4的倍数)的结果是12,填充3个字节所以sizeof(CPerf4)是12。

#pragma pack(2) typedef struct {

char a; /*第一个成员,放在[0]偏移的位置*/

short b;/*第二个成员,自身长2,#pragma pack(4),取2,按2字节对齐,所以

放在偏移[2,3]的位置。*/

char c; /*第三个,自身长为1,放在[4]的位置。*/ }CPerf5

内存布局示意图(白色框为填充字节)

整个结构的大小是5字节,按照min(sizeof(short),2)字节对齐,也就是2字节对齐,结果是6,所以sizeof(CPerf5)是6。

对例子[1]中的第一个结构改为按2字节对齐,9按2对齐的结果是10 #pragma pack(2) typedef struct {

int aa; /*第一个成员,放在[0,3]偏移的位置*/

char a;/*第二个成员,自身长为1,#pragma pack(2),取小值,也就是1,所以

这个成员按一字节对齐,放在偏移[4]的位置。*/

short b;/*第三个成员,自身长2,#pragma pack(2),取2,按2字节对齐,所

以放在偏移[6,7]的位置。*/

1 2 3 4 5 偏移量

char c; /*第四个,自身长为1,放在[8]的位置。*/ };

内存布局示意图(白色框为填充字节)

例子[2]:

#pragma pack(8) struct s1 {

short a; long b; }; struct s2 {

char c; struct s1 d; double e; };

S1内存布局示意图(

偏移量

1 2 3 4 5 6 7 8 9 偏移量

1 2 3 4 5 6 7

S2内存布局示意图(白色框为填充字节)

16 17 18 19 20 21 22 23 4 5 6 7 8 9 10 11 偏移量

12 13 14 15 0

1 2 3

S1中,成员a 是2字节,默认按2字节对齐,指定对齐参数为8,这两个值中取2,a 按2字节对齐;成员b 是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8; S2中,c 按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d 就是按4字节对齐.成员e 是8个字节,按照两步走的方法,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e 按8字节对齐)整除.这样,一共使用了24个字节.

C 编译器对结构空间缺省的分配

在C 语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int 、long 、float 等)的变量,也可以是一些复合数据类型(如数组、结构、联合等等)的数据单元。在结构中,编译器为结构的每个成员按其自然对齐(alignment )条件分配空间;各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。在缺省情况下,C 编译器为每一个变量或是数据单元按其自然对齐条件分配空间,在Windows 和pSOS 下的编译器,默认自然对齐,整个结构对齐方法按照结构成员中的最大长度对齐.

例如,下面的结构各成员空间分配情况如下图所示: struct test { char x1; short x2; float x3; char x4; };

内存布局示意图(白色框为填充字节)

偏移量

1 2 3 4 5 6 7 8 9 10 11

结构的第一个成员x1,其偏移地址为0,占据了第1个字节。第二个成员x2为short 类型,其起始地址必须2字节对齐,因此,编译器在x2和x1之间填充了一个空字节。结构的第三个成员x3和第四个成员x4恰好落在其自然对界地址上,在它们前面不需要额外的填充字节。在test 结构中,成员x3要求4字节对界,是该结构所有成员中要求的最大对界单元,因而test 结构的自然对界条件为4字节,编译器在成员x4后面填充了3个空字节。整个结构所占据空间为12字节。 如果将X2的类型换为int 类型,大家可以再进一步想想内存布局的结果?

试题分析 【1】内存布局示意图

typedef struct {

unsigned short wItemOne; /*变量One 为两个字节,按照2自然对齐,占用[0,1]*/

unsigned long dwItemTwo;/*变量Two 为四个字节,按照4自然对齐,占用[4,7],填充[2,3]字节*/ unsigned char bItemThree;/* 变量Three 为1个字节,按照1自然对齐,占用[8]*/ unsigned char bItemFour; /* 变量Foure 为1个字节,按照1自然对齐,占用[9]*/ unsigned char bItemFive; /* 变量Five 为1个字节,按照1自然对齐,占用[10]*/ } CPerf1;

整个结构占用11个字节,结构对齐按照成员中最大长度(4)对齐,11对齐4为12,所以再填充一个字节,所以sizeof(CPerf1)为12

1 2 3 4 5 6 7 变量8 9 10 11 偏移量

【2】内存布局示意图

#pragma pack(1) typedef struct {

unsigned short wItemOne; /*变量One 为两个字节,#pragma pack(1),取最小值1,按照1,占用

[0,1]*/

unsigned long dwItemTwo;/*变量Two 为四个字节,#pragma pack(1),取最小值1,按照1对齐,占

用[2,5]

unsigned char bItemThree;/* 变量Three 为1个字节,按照1对齐,占用[6]*/ unsigned char bItemFour; /* 变量Foure 为1个字节,按照1对齐,占用[7]*/ unsigned char bItemFive; /* 变量Five 为1个字节,按照1对齐,占用[8]*/ } CPerf1;

整个结构占用11个字节,结构对齐按照成员中最大长度(4)对齐,11对齐4为12,所以再填充一个字节,所以sizeof(CPerf1)为12

【3】#如果#pragma pack(n)中的n>=结构中成员的最大长度, pragma pack 其实没有起到作用,所以它的内存布局与[1]一样,但是分析的过程是不一样的.

1 2 3 4 5 6 7 变量8 偏移量

sizeof进行结构体大小的判断

sizeof进行结构体大小的判断 typedef struct { int a; char b; }A_t; typedef struct { int a; char b; char c; }B_t; typedef struct { char a; int b; char c; }C_t; void main() { char*a=0; cout<

2. 语法: sizeof有三种语法形式,如下: 1) sizeof( object ); // sizeof( 对象); 2) sizeof( type_name ); // sizeof( 类型); 3) sizeof object; // sizeof 对象; 5. 指针变量的sizeof 既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中,一 个指针变量的返回值必定是4(以字节为单位),可以预计,在将来的64位系统中指针变量的sizeof结果为8。 char* pc = "abc"; int* pi; string* ps; char** ppc = &pc; void (*pf)();// 函数指针 sizeof( pc ); // 结果为4 sizeof( pi ); // 结果为4 sizeof( ps ); // 结果为4 sizeof( ppc ); // 结果为4 sizeof( pf );// 结果为4 指针变量的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内存大小相等,所以MFC消息处理函数使用两个参数WPARAM、LPARAM 就能传递各种复杂的消息结构(使用指向结构体的指针)。 6. 数组的sizeof 数组的sizeof值等于数组所占用的内存字节数,如: char a1[] = "abc"; int a2[3];

民法学试题及答案(民法学1试卷号2097)

法学专业民法学(1)模拟试题 一.名词解释(每小题4分,共24分) 1.按份共有 2.房屋典权 3.民事法律事实 4.监护 5.法定代理 6.法人 二.填空(每空1分,共23分) 1.形式上的民法专指系统编纂的民事立法,即。实质上的民法是指所有调整财产关系和人身关系的民事法律规范的。 2.《民法通则》第4条规定,民事活动应当遵循自愿、等价有偿、的原则。 3.民事法律关系的三要素是指、和。 4.公民的民事权利能力一律。 5.按照《民法通则》的规定,未成年人的父母是未成年人的。 6.法人终止,应当依法进行,停止的活动。 7.根据代理权产生原因的不同,代理相应分为、委托代理和三类。8.《民法通则》规定,诉讼时效期间从或起计算。 9.传统民法将他物权分为和。 10.以占有人主观上是否知道其占有属于非法为标准,可将不法占有分为和。11.在我国共同共有基本形式有和两种。 12.《民法通则》规定,不动产的相邻各方,应当按照、方便生活、、公平合理的精神,正确处理相邻关系。 三.选择题(每小题2分,共20分,多选少选不给分) 1.我国民法的调整对象是()。 A.一定范围的财产关系和人身关系 B.财产关系和人身关系 C.人身关系 D.财产关系 2.民事权利根据其成立要件是否全部实现,可以分为()。

A.既得权和期待权 B.财产权和人身权 C.主权利和从权利 D.绝对权和相对权 3.在对外关系上,除法律另有规定外,全体合伙人对合伙债务承担()。 A.有限清偿责任 B.无限清偿责任 C.无限连带清偿责任 D.按份责任 4.民事法律关系的客体应为()。 A.物 B.行为 C.智力成果 D.人身内容 5.公民死亡即丧失法律上的人格,随之产生一系列相应的法律后果:()。 A.遗嘱发生效力 B.财产开始继承 C.债权债务消灭 D.婚姻关系消灭 6.法人终止的原因有()。 A.依法被撤销 B.解散 C.违约或侵权 D.依法宣告破产 7.自阿附条件的民事法律行为中,作为行为的附属要件,条件应符合的要求有()。 A.条件必须是将来发生的事实 B.条件是将来必定发生的事实 C.条件是法定而非当事人议定的 D.条件不得与行为的主要内容相矛盾 8.《民法通则》规定,委托书授权不明的,()。 A.代理人应当向第三人承担民事责任 B.被代理人应当向第三人承担民事责任 C.代理人负连带责任 D.代理人与第三人负连带责任 9.法人机关成员执行职务的行为体现着()。 A.法人机关成员的个人意志 B.法人代理人的意志

电大民法学1(已排好)

一、名词解释 1.人格关系:指因民事主体的人格利益所发生的社会关系。 2.房屋典权:指典权人支付典价,占有他人的房屋,并对其进行占有、使用、收益的权利。 3.表见代理:指无权代理人的代理行为客观上存在使相对人相信其有代理权的情况,且相对人主观上为善意且无过失,因而可以向被代理人主张代理的效力。 4.监护:是为保护无民事行为能力人和限制民事行为能力人的人身和财产权利而由特定公民或组织对其予以监督和保护的制度。 5.民事义务:是指为满足权利人的利益而为一定的行为或不为一定的行为的必要性。 6.按份共有:指两个或两个以上的共有人按照各自的份额分别对共有财产享有权利和承担义务的一种共有关系。 7.法人:是具有民事行为能力和民事权利能力,依法独立享有民事权利和承担民事义务的组织。 8.复代理:指代理人为了被代理人的利益,转托他人实施代理的行为。 9.抗辩权:是指对抗请求权或否认对方权利的权利。 10.共有:是指某项财产由两个或两个以上的权利主体共同享有所有权。 11.国有土地使用权:指民事主体依法对国家所有的土地享有使用和收益的权利。 12.善意取得:是指无权处分他人动产的占有人,在不法将动产转让给第三人以后,如果受让人在取得该动产时出于善意,就可依法取得对该动产的所有权,受让人在取得动产的所有权之后,原所有人不得要求受让人返还财产,而只能请求转让人(占有人)赔偿损失。 13.民事法律事实:是指依法能够引起民事法律关系发生、变更和消灭的客观现象。14.法定代理:是指法律根据一定的社会关系的存在而设立的代理。它是为无行为能力人和限制行为能力人设立的代理方式。 15.财产关系:是指人们在产品的生产、分配、交换和消费过程中形成的具有经济内容的关系。 16.平等原则:是指民事主体享有独立法律人格,在具体的民事关系中互不隶属,地位平等,各自能够独立地表达自己的意志。 17.其他物权:是指所有权以外的物权,它是在所有权权能与所有权发生分离的基础上产生的,由他物权人对享有一定程度的直接支配权。 18.诉讼时效:权利人在法定期间那不行使权利就丧失请求人民法院保护其民事权利的可能性的制度。 19.民法:是调整平等主体的公民之间、法人之间、公民和法人之间的财产关系和人身关系的法律规范的总和。 20.不动产:是指不能移动或如经移动即会损害和降低其经济价值的物。 21.时效:是指一定的事实状态持续一定时间之后即发生一定法律后果的制度。 22.相邻关系是两个或两个以上担互毗邻的不动产的所有人或使用人,在行使不动产所有权或使用权时,因相邻各方应当给与便利和接受限制而发生的权利义务关系。 二、填空题 1.我国民法是调整平等主体的公民之间、法人之间、公民和法人之间的财产关系和人身关系的法律规范的总和。 2.根据客观事实是否与人的意志有关,法律事实可以分为事件和行为两大类。 3.根据《民法通则》规定,公民从出生时起到死亡时止,具有民事权利能力。 4.16周岁以上不满18周岁的公民,以自己的劳动收人为主要生活来源的,视为完全民事行为能力人。 5.依据《民法通则》的规定,联营主要有法人型联营、合伙型联营和合同型联营三种形式。 6.根据期限对民事法律行为效力所起作用不同,分为延续期限和解除期限。 7.《民法通则》规定,可撤销的民事行为包括重大误解的民事行为、显失公平的民事行为的民事行为。 8.《民法通则》规定,民事法律行为的委托代理,可以用书面形式,也可以用口头形式。法律规定用书面形式的,应当用书面形式。 9.民法上的期限,依期限的确定根据,可将其分为法定期限、指定期限、意定期限。 10.共有财产的分割方式有实物分割、变价分割、作价补偿。 11.形式上的民法专指系统编纂的民事立法,即民法典。实质上的民法是指所有调整财产关系和人身关系的民事法律规范的总称。 12.《民法通则》第4条规定,民事活动应当遵循自愿公平、等价有偿、诚实信用的原则。 13.民事法律关系的三要素是指主体、客体和内容。 14.公民的民事权利能力一律平等。 15.按照《民法通则》的规定,未成年人的父母是未成年人的法定监护人。 16.法人终止,应当依法进行清算,停止清算范围外的活动。 17.根据代理权产生原因的不同,代理相应分为法定代理、委托代理和指定代理三类。 18.《民法通则》规定,诉讼时效期间从知道或应当知道权利被侵害时起计算。 19.传统民法将他物权分为用益物权和担保物权。 20.以占有人主观上是否知道其占有属于非法为标准,可以将不法占有分为善意占有和恶意占有。 21.在我国共同共有基本形式有夫妻共有财产和家庭共有财产两种。 22.《民法通则》规定,不动产的相邻各方,应当按照有利生产、方便生活、团结互助、公平合理的精神,正确处理相邻关系。 23.平等主体之间的财产关系,包括_财产所有_关系和_财产流转_关系。 24.公民、法人的合法民事权益受到法律保护,任何_组织_和_个人_不得侵犯。25.根据权利的作用,民事权利可以分为_支配_权、_请求_权、_抗辩_权和_形成_权。26.民法上的死亡分为_生理死亡_和_宣告死亡_。 27.《民法通则》规定;“个人合伙是指两个以上公民按照协议,各自提供_资金_、_实物__、__技术_等,合伙经营、共同劳动。” 28.法人的民事权利能力和民事行为能力从法人成立时产生,到法人终止时效灭。 29.《民法通则》规定,双方恶意串通实施民事行为损害国家、集体或第三人利益的。应当_追缴_双方取得的财产,收归_国家_、_集体_所有或返还_第三人_。 30.诉讼时效中止的法定事由有;(1)_ 不可抗力_;(2)_其他障碍_。 31.担保物权主要包括:_抵押_权、_质押_权和_留置_权。 32.财产所有权形式可以分为_单独所有_和_共有_两种。 33.恩格斯曾经指出:“民法准则只是以_法律形式_表现了社会的经济生活条件。” 34.民法通则规定,合伙人投入的财产,由合伙人统_管理_和_使用_。 35.企业法人终止,应当向_登记机关_办理注销登记并公告。 36.民事法律行为可以附条件,附条件的民事法律行为在_符合所附条件_时生效。 37.代理人知道被委托代理的事项违法仍然进行代理活动,由_被代理人_和_代理人_负连带责任。 38.诉讼时效按其适用的范围可分为_普通诉讼时效期间_和__特殊诉讼时效期间_。 39.民法对物权的保护,可以依据权利人是否通过诉讼程序而分为物权的_自我保护__和_诉讼_保护。 40.财产所有权的合法取得方式可分为__原始取得_和__继受取得_两种。 41.占有分为_所有人占有_和_非所有人占有_两种情形。 42.在发生相邻房屋滴水纠纷后,对有过错的一方造成它方损害的,应当责令其排除妨碍、赔偿损失。 43.房屋典权是指典权人支付典价,占有他人的房屋,并对其进行_占有_、_使用_、__收益_的权利。 44.民事法律关系的要素包括_主体_、_内容_、_客体_三个要素。 45.民法通则规定_16周岁__以上_不满18周岁_的公民,以__自己的劳动收入为主要生活_ 来源的,视为完全民事行为能力人。 46.法人的民事权利能力和民事行为能力,从__法人成立时_产生,到__法人终止时_终止。 47.根据我国民法通则的规定,可撤销的民事行为包括__重大误解的民事行为_和_显失公平的民事行为_两种。 48.民事法律行为的形式有_口头形式_、_书面形式_、_推定形式_、_沉默形式_。 49.民法上的期限,依确定根据,可分为_法定期限_、_指定期限_、_意定期限_。 50.财产所有权的合法取得方式可分为__原始取得__与_继受取得_。 51.收益在法律上又称为孳息,它分为_天然孳息_与_法定孳息_两种。 52.物权分为_所有权_和_其他物权_。 53.公民从_出生时_到_死亡时_,具有民事权利能力,依法享有民事权利,承担民事义务。 三、选择题 1.如果公民在战争期间下落不明.申请宣告其失踪的法定期间应自( D )起计算。 A.失踪人最后离开住所之日 B.失踪人最后离开居所之日 C.公民音讯消失之次日 D.战争结束之日 2.根据我国《民法通则》的规定,有权依法转让自己名称的社会组织是( A )。 A.企业法人 B.国家机关法人 C.事业单位法人 D.社会团体法人 3.某纺织厂的法定代表人是该厂的( B )。 A.党委书记 B.厂长 C.工会主席 D.副厂长 4.某甲将一台彩电赠给某乙,该项民事法律行为属于( C )。 A.诺成性法律行为 B.要式法律行为 C.单务法律行为 D.单方法律行为 5.根据物权法原理,下列行为中属于财产所有权继受取得的根据是( BC ) A.没收 B.买卖合同 C.赠与 D.取得孽息 6.下列物中,属于有价证券的是( ABC )。 A.股票 B.支票 C.本票 D.发货票 7.按照我国《民法通则》的规定,无效的民事行为包括( ABD ) A.行为人不合格的民事行为 B.因受胁迫而为的民事行为 C.显失公平的民事行为 D.乘人之危的民事行为 8.根据共同共有的一般理论,共同共有的特点有( ABCD )。 A.共有财产不分份额 B.以共同关系的存在为前提 C.共有人平等地享受权利 D.共有人平等地承担义务 9.下列( ABCD )属于国家所有权的客体。 A.矿藏 B.森林 C.军事设施 D.广播设施 10.动产物权包括( ABCD )。 A.动产所有权 B.留置权 C.动产的抵押权 D.以国库券作抵押 11.我国民法的调整对象是( B )。 A.一定范围的财产关系和人身关系 B.财产关系和人身关系 C.人身关系 D.财产关系 12.民事权利根据其成立要件是否全部实现,可以分为( A )。 A.既得权和期待权 B.财产权和人身权 C.主权利和从权利 D.绝对权和相对权 13.在对外关系上,除法律另有规定外,全体合伙人对合伙债务承担( C ) A.有限清偿责任 B.无限清偿责任 C.无限连带清偿责任 D.按份责任 14.民事法律关系的客体应为( ABCD )。

C 语言中 地址对齐与数据对齐

------------------------------Editor: JaceLin-----------------Date: 2014.2.7--------------------------- C语言中的地址&数据对齐 NOTE: 在单片机开发中,不论是什么样的单片机,打开官方头文件都会发现,里面全是各种各样的结构体(struct)与宏定义(define),但不论定义的字母多么长多么难懂,它们的最终映像都是一个16进制的地址。对于一个单片机初学者来说,看到这些定义往往会很头痛,因为平时基本都是用别人的头文件,很少去写自己的单片机头文件。 前几天一直在写一个freescal K60单片机DMA程序,DMA就是‘直接对寄存器存取’,顾名思义,这个程序要涉及寄存器的操作(其实所有的单片机程序都是操作寄存器,只是定义了宏不直观而已)!DMA对于我来说第一次接触,中间就接触到了许多关于前面所说的官方给的struct与define,但是我感觉他们写的都很啰嗦过于繁琐,于是为了简化程序,我不得不弄清楚这些定义到底是什么意思。我专门去网上找了很多关于这方面的资料,最后我得出结论,其实就是两个方面内容:地址对齐与数据对齐! 下面就让我来解读这些难懂的struct & define. 一、数据对齐(以下内容都以32bit x86/arm平台为例) 在没有#progma pack(n)参数的情况下: 例1: struct A{ char a; char b; char c; }; Sixeof(struct A) =多少? 分析:一个char 长度为1个字节,而内存单元为4个字节,以上struct A 占用内存如下图:

民法学1-名词解释

名词解释 民法:是调整平等主体的公民之间、法人之间、公民和法人之间的财产关系和人身关系的法律规范的总和。 财产关系:是指人们在产品的生产、分配、交换和消费过程中形成的具有经济内容的关系。 人格关系:是指因民事主体的人格利益所发生的社会关系。 平等原则:是指民事主体享有独立的法律人格,在具体的民事关系中互不隶属、地位平等,各自能独立地表达自己的意志。 民事法律事实:是指依法能够引起民事法律关系发生、变更和消灭的客观现象。 民事权利:是指民事主体为实现某种利益而依法为某种行为或不为某种行为的可能性。 民事义务:是指义务人为满足权利人的利益而为一定的行为或不为一定的行为的必要性。 抗辩权:是指对抗请求权或否认对方权利的权利 监护:是为保护无民事行为能力人和限制民事行为能力人的人身和财产权利而由特定公民或组织对其予以监督和保护的制度。 宣告失踪:是公民下落不明达到法定期限,经利害关系人申请,由人民法院宣告该公民死亡的民事法律制度。个人合伙:是指两个以上公民出于共同的经济目的,自愿签订协议,共同出资和经营,共负盈亏和风险,对外负无限连带责任。 法人:是具有民事权利能力和民事行为能力,依法独立享有民事权利和承担民事义务的组织。 法人的清算:指法人终止后由清算组织依据职权清理并消灭法人的全部财产关系。 联营:是企业之间、企业与事业单位之间在平等自愿基础上为实现一定经济目的而达成的联系。 不动产:是指不能移动或如经移动即会损害和降低其经济价值的物。 附条件的民事法律行为:指设定一定的条件,并将条件的成就与否作为决定效力发生或消灭的根据的民事法律行为。 附期限的民事法律行为:指的是当事人为民事法律行为设定一定的期限,并把期限的到来作为民事法律行为效力发生或者消灭的前提。 可撤销的民事行为:指的是依照法律的规定,可由当事人请求法院或仲裁机关予以变更或撤销的民事行为。代理:是指代理人在代理权范围内以被代理人名义与第三人实施的、法律效果直接归属于被代理人的行为及相应的法律制度。 法定代理:是指法律根据一定的社会关系的存在而设立的代理。 指定代理:是按照人民法院或者有权机关的指定而产生的代理。 复代理:又称再代理,指代理人为了被代理人的利益,转托他人实施代理的行为。 表见代理:指无权代理人的代理行为客观上存在使相对人相信其有代理权的情况,且相对人主观上为善意且无过失,因而可以向被代理人主张代理的效力。 时效:是指一定的事实状态持续一定时间之后即发生一定法律后果的制度。 诉讼时效:指的是权利人在法定期间内不行使权利就丧失请求人民法院保护其民事权利的可能性的制度。 物权:是由法律确认的主体对物依法所享有的支配的权利。 物权的追及效力:是指物权的标的物不管辗转流入什么人的手中,物权人都可以依法向物的不法占有人索取,请求其返还原物。 担保物权:是指以担保债权为目的,即以确保债务的履行为目的的物权,包括抵押权、质权、留置权、典权等。财产所有权:是指所有人依法对自己的财产享有的占有、使用、收益和处分的权利。 善意占有:是指不法占有人在占有他人财产时,不知道或者无法知道占有是非法的。 善意取得:是无权处分他人动产的占有人,在不法将动产转让给第三人以后,如果受让人在取得该动产时出于善意,就可依法取得对该动产的所有权。 按份共有:指两个或两个以上的共有人按照各自的份额分别对共有财产享有权利和承担义务的一种共有关系。共同共有:指两个或两个以上的公民或法人,根据某种共同关系而对某项财产不分份额地共同享有权利并承担义务 相邻关系:是两个或两个以上相互毗邻的不动产的所有人或使用人,在行使不动产的所有权或使用权时,因相邻各方应当给予便利和接受限制而发生的权利义务关系。 其他物权:是指非所有人在所有人的财产上享有的占有、使用、收益权以及在特殊情况下依法享有的处分权。国

内存对齐方式

对齐方式 为什么会有内存对齐? 在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间;各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。在缺省情况下,C编译器为每一个变量或数据单元按其自然对界条件分配空间。 字,双字,和四字在自然边界上不需要在内存中对齐。(对字,双字,和四字来说,自然边界分别是偶数地址,可以被4整除的地址,和可以被8整除的地址。)无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。 一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界,被认为是未对齐的,从而需要两次总线周期来访问内存。一个字起始地址是奇数但却没有跨越字边界被认为是对齐的,能够在一个总线周期中被访问。 某些操作双四字的指令需要内存操作数在自然边界上对齐。如果操作数没有对齐,这些指令将会产生一个通用保护异常(#GP)。双四字的自然边界是能够被16整除的地址。其他的操作双四字的指令允许未对齐的访问(不会产生通用保护异常),然而,需要额外的内存总线周期来访问内存中未对齐的数据。 影响结构体的sizeof的因素: 1)不同的系统(如32位或16位系统):不同的系统下int等类型的长度是变化的,如对于16位系统,int的长度(字节)为2,而在32位系统下,int的长度为4;因此如果结构体中有int等类型的成员,在不同的系统中得到的sizeof值是不相同的。 2)编译器设置中的对齐方式:对齐方式的作用常常会让我们对结构体的sizeof 值感到惊讶,编译器默认都是8字节对齐。 对齐: 为了能使CPU对变量进行高效快速的访问,变量的起始地址应该具有某些特性,即所谓的“对齐”。例如对于4字节的int类型变量,其起始地址应位于4字节边界上,即起始地址能够被4整除。变量的对齐规则如下(32位系统)

民法学名词解释

1、民法,是指调整平等主体的自然人、法人和其他组织之间的财产关系和人身关系的法律规范的总和。 2、财产关系,是指人们在产品的生产、分配、交换和消费过程中形成的具有经济内容的关系。 3、人身关系,是指因民事主体的人格利益而发生的社会关系。 4、民法的基本原则,是民法及其经济基础的本质和特征的集中体现,是高度抽象的、最一般的民事行为规范和价值判断准则。 5、自愿原则,法律确认民事主体得自由地基于其意志去进行民事活动的基本准则。 6、公平原则,是指民事主体应依据社会公认的公平观念从事民事活动,以维持当事人之间的利益均衡。 7、诚实信用原则,是市场经济活动中形成的,要求人们在市场活动中讲究信用、恪守诺言、诚实不欺,在不损害他人利益和社会利益的前提下追求自己的利益。 8、民事法律关系,是由民事法律规范调整所形成的以民事权利和民事义务为核心内容的社会关系。 9、财产法律关系,是指因财产的所有和财产的流转所形成的、满足民事主体财产利益需要的民事法律关系。 10、人身关系,是指与民事主体的人身不可分离、为满足民事主体的人身利益所形成的民事法律关系。 11、绝对法律关系,是指与权利人相对应的义务人是权利人以外的一切不特定人的民事法律关系。 12、相对法律关系,是指与权利人相对应的义务人是特定人的民事法律关系。 13、物权关系,指权利人可以直接支配物,不需要义务人实施某种积极行为予以配合即可行使并实现其权利的民事法律关系。 14、债权关系,是指权利人必须由义务人的一方行为相配合,才能行使和实现其权利的民事法律关系。 15、自然人,是基于出生而取得民事主体资格的人。 16、监护,是指对未成年人和精神病人的人身、财产及其他合法权益进行监督和保护的一种民事法律制度。 17、宣告失踪,是指自然人离开自己的住所,下落不明达到法定期限,经利害关系人申请,由人民法院宣告其为失踪人的法律制度。 18、宣告死亡,是指自然人离开自己的住所,下落不明达到法定期限,经利害关系人申请,由人民法院宣告其死亡的法律制度。 19、个体工商户,是指自然人在法律允许的范围内,依法经核准登记,从事工商业经营的。 20、农村承包经营户,是指农村集体经济组织的成员,在法律允许的范围内,按照承包合同规定从事商品经营的。 21、个人合伙,是指两个以上的自然人按照协议,各自提供资金、实物、技术等共同经营,共同劳动。 22、退伙,是指合伙人与其他合伙人脱离合伙关系,丧失合伙人资格的行为。 23、入伙,是指合伙成立后,第三人加入合伙并取得合伙人资格的行为。 24、法人,是具有民事权利能力和民事行为能力,依法独立享有民事权利和承担民事义务的组织。 25、社团法人,以人的组合作为法人成立基础的私法人。 26、财团法人,是指以一定的财产的设定作为成立基础的私法人。 27、企业法人,以从事生产、流通、科技等活动为内容,以获取盈利和增加积累、创造社会财富为目的的营利性社会经济组织。 28、机关法人,是指依法享有国家赋予的行政权力,并因行使职权的需要而享有相应的民事权利能力和民事行为能力的国家机关。 29、事业单位法人,是指为了社会公益事业目的,由国家机关或者其他组织利用国有资产举办的,从事文化、教育、卫生、体育、新闻等公益事业的单位。 30、社团法人,是指自然人或法人自愿组成,为实现会员共同意愿,按照其章程开展活动的非营利

c++中关于结构体长度的计算问题

[C++]字节对齐与结构体大小 [C++] 2010-09-24 21:40:26 阅读172 评论0 字号:大中小订阅 说明: 结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对sizeof我们将在另一篇文章中总结,这篇文章我们只总结结构体的sizeof,报着不到黄河心不死的决心,终于完成了总结,也算是小有收获,拿出来于大家分享,如果有什么错误或者没有理解透的地方还望能得到提点,也不至于误导他人。 一、解释 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如

有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int 型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。 二、准则 其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则: 1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 2. 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节; 3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。 三、基本概念

民法学(1)作业参考答案

民法学(1)作业参考答案 一、名词解释(每小题4分,共24分) 1.民法 P、4 2.联营 P、76 3.宣告火踪 P、48 4.时效 P、117 5.法定代理 P 、107. 二、填空(每空1分,共20分) 1.形式上的民法专指系统编纂的民事立法,即民法典。实质上的民法是指所有调整财产关系和人身关系的民事法律规范的。P、3 2.《民法通则》第4条规定,民事活动应当遵循自愿公平、等价有偿、诚实信用的原则。P、16 3.民事法律关系的三要素是指一主体、客体、内容。P、25 4.公民的民事权利能力一律平等。P、36 5.按照《民法通则》的规定,未成年人的父母是未成年人的监护人。P、44 6.法人终止,应当依法进行清算,停止清算范围外的活动。P74 7.可撤销的民事行为包括:重大误解、显失公平的民事行为。P102---103 8.《民法通则》规定,民事法律行为的委托代理,可以用书面形式,也可以用 口头形式。法律规定用书面形式的,应当用书面形式。P、108 9.民法上的期限,依期限的确定根据,可将其分为法定期限、指定期限、意定期限。 三、选择题(每小题3分,共24分。每小题所给的备选答案中有一个或一个以上的正确答案,多选或少选不给分) 1.民法通则规定限制民事行为能力是指(A、、C)。P、41 A.10周岁以上的未成年人 B.14周岁以上的未成年人 C.不能完全辨认自己行为的精神病人 2.利害关系人向人民法院申请宣告公民为失踪人,该公民必须下落不明满(A)。P、48 A.二年B.四年c.五年 3.在民法上房屋属于(A)。p、82 A.不动产B.流通物c.限制流通物 4.张某不习水性,不慎落水急忙呼救,杨某经过,要求张某付1万元人民币方救张某,张无奈 同意付钱,杨某遂将张某救上岸,其要求付钱行为是(B)。 P、100. A.有效的民事法律行为 B.无效的民事行为

C语言内存对齐

解析C语言结构体对齐(内存对齐问题) C语言结构体对齐也是老生常谈的话题了。基本上是面试题的必考题。内容虽然很基础,但一不小心就会弄错。写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢? 开始学的时候,也被此类问题困扰很久。其实相关的文章很多,感觉说清楚的不多。结构体到底怎样对齐? 有人给对齐原则做过总结,具体在哪里看到现在已记不起来,这里引用一下前人的经验(在没有#pragma pack宏的情况下): 原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。) 原则3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。 这三个原则具体怎样理解呢?我们看下面几个例子,通过实例来加深理解。 例1:struct { short a1; short a2; short a3; }A; struct{ long a1; short a2; }B; sizeof(A) = 6; 这个很好理解,三个short都为2。 sizeof(B) = 8; 这个比是不是比预想的大2个字节?long为4,short为2,整个为8,因为原则3。 例2:struct A{ int a; char b; short c; }; struct B{ char b; int a; short c; }; sizeof(A) = 8; int为4,char为1,short为2,这里用到了原则1和原则3。 sizeof(B) = 12; 是否超出预想范围?char为1,int为4,short为2,怎么会是12?还是原则1和原则3。

C语言结构体对齐

C语言结构体对齐 C语言结构体对齐也是老生常谈的话题了。基本上是面试题的必考题。内容虽然很基础,但一不小心就会弄错。写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢? 开始学的时候,也被此类问题困扰很久。其实相关的文章很多,感觉说清楚的不多。结构体到底怎样对齐? 有人给对齐原则做过总结,具体在哪里看到现在已记不起来,这里引用一下前人的经验(在没有#pragma pack宏的情况下): 原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 原则2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b 里有char,int,double等元素,那b应该从8的整数倍开始存储。) 原则3、收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。 这三个原则具体怎样理解呢?我们看下面几个例子,通过实例来加深理解。 例1:struct { short a1; short a2; short a3; }A; struct{ long a1; short a2; }B; sizeof(A) = 6; 这个很好理解,三个short都为2。 sizeof(B) = 8; 这个比是不是比预想的大2个字节?long为4,short为2,

经验技巧8-1 结构体变量的存储长度

经验技巧8-1 结构体变量的存储长度 结构体变量的存储长度,跟编译器字节对齐密切相关。为了使CPU对变量进行快速高效的访问,变量的起始地址应该满足某些特性,即所谓的对齐。关于字节对齐有两个重要的宏:#pragma pack (n)和#pragma pack。 (1)#pragma pack (n):一般情况下,此宏的作用在于强制编译器以n的倍数进行地址对齐。 (2)#pragma pack:结束前面设置的对齐方式,恢复到编译器默认的对齐方式。 Visual C++默认的字节对齐数为8。 结构体变量中的成员item在结构体中相对于首地址的偏移量应该是X的倍数,X由如下式决定: X=min(n,sizeof(item)),(item是占字节最大的类型的成员) 【示例1】假设n为8,若有如下定义 struct Test { char c1; char c2; int i;}; struct Test t; 那么在存储结构体变量t的成员i时,X就应该是min(8,sizeof(int))=4的倍数,即i相对于结构体变量首地址的偏移量必须是4的倍数,所以t的大小就应该为8=(2+2+4)字节(在c1和c2后填充了两个字节以满足前述条件)。 而对于struct { char c1; char c2} t;则不会出现填充的的情况,每个成员相对首地址的偏移量也满足是X的倍数(此时X为1),变量t的大小为2字节。 【示例2】若有结构体变量:struct {char c1; double d;} t;,默认情况下结构体变量t占用16=(8+8)字节(在c1后填充7个字节以满足字节对齐)。如果强制编译器以4字节对齐,即在声明这种结构体变量前有宏定义#pragma pack (4),此时X为4,则此种类型结构体变量占用的内存为12=(4+8)字节。 还有一种特殊情况,就是空结构体。在Visual C++下其大小为1,即struct{}类型的变量在VC下输出其大小是1,原因就是VC为每个结构体变量分配一个字节的内存,以使该变量有个地址;而在gcc下输出其大小为0。 最后,结构体成员中有结构体变量的情况见下例: 【示例3】若有struct test1 { char c1; int i ; char c2 ;}t1;则X=4,所以t1占用4+4+4=12个字节,那么对于struct test2 { int i; struct test1 t1; char c2; }t2;有X=min{8,max(4,4,1)}=4,所以t2占用4+12+4=20个字节,在确定上述的X时会把t1拆散成基本数据类型来处理,而计算结构体变量t2的大小时又会把t1作为一个整体来对待。故默认情况下,结构体test2类型变量的大小为:20字节。

民法作业1参考答案

民法作业1参考答案 一、名词解释: 1、民法是调整平等主体的公民之间、法人之间、公民和法人之间的财产关系和人身关系的法律规范的总和,它在我国法律体系中居于基本法的地位。 2、联营是企业之间、企业与事业单位之间在平等自愿基础上为实现一定经济目的而达成的联合。 3、宣告失踪指公民下落不明满法定期限,经利害关系人申请,由人民法院依照法定的条件和程序宣告其为失踪人并对其财产实行代管的民事法律制度。 4、时效是指一定的事实状态持续一定时间之后即发生一定法律后果的制度。 5、法定代理是指法律根据一定的社会关系的存在而设立的代理。 二、填空: 1、形式上的民法专指系统编纂的民事立法,即(民法典)。实质上的民法是指所有调整财产关系和人身关系得民事法律规范的总称。 2、《民法通则》第4条规定,民事活动应当遵行自愿(公平)、等值有偿、(诚实信用)的原则。 3、民事法律关系的三要素是指(民事法律关系的主体)、(民事法律关系的客体)和(民事法律关系的内容)。 4、公民的民事权利能力一律(平等)。 5、按照《民法通则》的规定,未成年人的父母是未成年人的(监护人)。 6、法人终止,应当依法进行(清算),停止(清算范围外的)的活动。 7、可撤销的民事行为包括(重大误解的民事行为)、(显失公平的民事行为)。 8、《民法通则》规定,民事法律行为的委托代理,可以用(书面)形式,也可以用(口头)形式。法律规定用(书面形式)的,应当用(书面形式)。 9、民法上的期限,依期限的确定根据,可将其分为(法定期限)、(指定期限)、(意定/约定期限)。 三、选择题:

1、民法通则规定限制民事行为能力是指(10周岁以上的未成年人)、(不能完全辨认自己行为的精神病人)。 2、利害关系人向人民法院申请宣告公民为失踪人,该公民必须下落不明满(二年)。 3、在民法上房屋属于(不动产)。 4、张某不习水性,不慎落水急忙呼救,杨某经过,要求张某付1万元人民币救张某,张无奈同意付钱,杨遂将张就起,其要求付钱行为是(无效的民事行为)。 5、民法通则规定的一年特殊诉讼时效,适用于(身体受到伤害要求赔偿的)、(出售质量不合格的商品未声明的)、(延付或者拒付租金的)。 6、民法通则规定(16周岁以上不满18周岁的公民)、(以自己的劳动收入为主要生活来源的)视为完全民事行为能力人。 7、法律规定(公民离开住所下落不明满4年)利害关系人可以申请宣告其死亡。 8、法人终止的原因有(依法被撤销)、(解散)、(依法宣告破产)。 四、问答题: 1、民事法律行为的有效条件是什么? 答:⑴行为人具有相应的民事行为能力;⑵意思表示真实;⑶民事法律行为的内容不违反法律或社会公共利益;⑷符合法定形式。 2、简述公民民事权利能力和民事权利的区别? 答:⑴民事权利能力仅是一种资格,是法律赋予民事主体享有的获取实际利益的可能性。这种资格是民事主体不论是否实际参加民事法律关系都普遍享有的。民事权利则是民事主体在具体的民事法律关系中所实际享有的利益,它必须通过实际的行为才能创设或取得;⑵民事权利能力示享受权利的资格和承担义务的资格的统一。而民事权利合民事义务则是在具体的民事法律关系中相互对应,各自独立的两个不同概念。⑶民事权利能力是一种法定资格,它与民事主体的个人意志无关,不能由其自由转让、放弃。而民事权利的内容和范围直接取决于民事主体的意志,可以依法转让和放弃。 作业2参考答案 一、试述公平自愿原则:论述参见课文第18-19页第二章我国民法的基本原则 二、试述诚实信用原则:论述参见课文第20页第二章我国民法的基本原则

C语言结构体的字节对齐及指定对齐方式

内存中结构体的内存对齐 一、字节对齐作用和原因: 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐,其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit 数据,显然在读取效率上下降很多。 二、字节对齐规则: 四个重要的概念: 1.数据类型自身的对齐值:对于char型的数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4个字节。 2.结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。 3.指定对齐值:#pragma pack (value)时指定的对齐value。 4.数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。补充: 1).每个成员分别按自己的方式对齐,并能最小化长度。 2).复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。 3).对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐。 #pragma pack(1) struct test { static int a; //static var double m4; char m1; int m3; } #pragma pack() //sizeof(test)=13;

stm32中使用#pragma pack(非常有用的字节对齐用法说明)

#pragma pack(4) //按4字节对齐,但实际上由于结构体中单个成员的最大占用字节数为2字节,因此实际还是按2字节对齐 typedef struct { char buf[3];//buf[1]按1字节对齐,buf[2]按1字节对齐,由于buf[3]的下一成员word a是按两字节对齐,因此buf[3]按1字节对齐后,后面只需补一空字节 word a; //#pragma pack(4),取小值为2,按2字节对齐。 }kk; #pragma pack() //取消自定义字节对齐方式 对齐的原则是min(sizeof(word ),4)=2,因此是2字节对齐,而不是我们认为的4字节对齐。 这里有三点很重要: 1.每个成员分别按自己的方式对齐,并能最小化长度 2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度 3.对齐后的结构体整体长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐 补充一下,对于数组,比如: char a[3];这种,它的对齐方式和分别写3个char是一样的.也就是说它还是按1个字节对齐. 如果写: typedef char Array3[3]; Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度. 不论类型是什么,对齐的边界一定是1,2,4,8,16,32,64....中的一个. 声明: 整理自网络达人们的帖子,部分参照MSDN。 作用: 指定结构体、联合以及类成员的packing alignment; 语法: #pragma pack( [show] | [push | pop] [, identifier], n ) 说明: 1,pack提供数据声明级别的控制,对定义不起作用; 2,调用pack时不指定参数,n将被设成默认值; 3,一旦改变数据类型的alignment,直接效果就是占用memory的减少,但是performance会下降; 语法具体分析: 1,show:可选参数;显示当前packing aligment的字节数,以warning message的形式被显示; 2,push:可选参数;将当前指定的packing alignment数值进行压栈操作,这里的栈是the internal compiler stack,同时设置当前的packing alignment为n;如果n没有指定,则将当前的packing alignment数值压栈; 3,pop:可选参数;从internal compiler stack中删除最顶端的record;如果没有指定n,则当前栈顶record即为新的packing alignment 数值;如果指定了n,则n将成为新的packing aligment数值;如果指定了identifier,则internal compiler stack中的record都将被pop 直到identifier被找到,然后pop出identitier,同时设置packing alignment数值为当前栈顶的record;如果指定的identifier并不存在于internal compiler stack,则pop操作被忽略; 4,identifier:可选参数;当同push一起使用时,赋予当前被压入栈中的record一个名称;当同pop一起使用时,从internal compiler stack 中pop出所有的record直到identifier被pop出,如果identifier没有被找到,则忽略pop操作; 5,n:可选参数;指定packing的数值,以字节为单位;缺省数值是8,合法的数值分别是1、2、4、8、16。 重要规则: 1,复杂类型中各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个类型的地址相同; 2,每个成员分别对齐,即每个成员按自己的方式对齐,并最小化长度;规则就是每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数中较小的一个对齐; 3,结构体、联合体或者类的数据成员,第一个放在偏移为0的地方;以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度两个中比较小的那个进行;也就是说,当#pragma pack指定的值等于或者超过所有数据成员长度的时候,这个指定值的大小将不产生任何效果; 4,复杂类型(如结构体)整体的对齐是按照结构体中长度最大的数据成员和#pragma pack指定值之间较小的那个值进行;这样当数据成员为复杂类型(如结构体)时,可以最小化长度; 5,复杂类型(如结构体)整体长度的计算必须取所用过的所有对齐参数的整数倍,不够补空字节;也就是取所用过的所有对齐参数中最大的那个值的整数倍,因为对齐参数都是2的n次方;这样在处理数组时可以保证每一项都边界对齐; 对齐的算法:由于各个平台和编译器的不同,现以本人使用的gcc version 3.2.2编译器(32位x86平台)为例子,来讨论编译器对struct 数据结构中的各成员如何进行对齐的。 在相同的对齐方式下,结构体内部数据定义的顺序不同,结构体整体占据内存空间也不同,如下: 设结构体如下定义: struct A { int a; //a的自身对齐值为4,偏移地址为0x00~0x03,a的起始地址0x00满足0x00%4=0;

相关文档
最新文档