在C/C 中常常需求进行存储器的操作,关于数据如安在存储器中存储的问题也是非常重要的,如安在确保数据量(信息量)的一起又确保数据的存储量最小,乍一听感觉没什么好评论的。可是作为学习嵌入式的必需求了解数据的存储是与数据的结构存在密切联系的,特别是结构体中的内存分配问题。
首要应该了解根本的类型在内存中的巨细,char型一般占有1个字节,int型一般占有4个字节,double型一般占有8个字节,short 则占有2个字节(当然也会存在必定的改变,详细情况根据编译器决议)。咱们都知道C言语的结构体是一个不同类型数据的调集。那么一个结构体究竟占多少存储空间呢?
首要应该意识到C言语的存储存在必定的特殊性。在C言语的结构体中需求首要的是数据存储的对齐方法。对齐首要是为了便利数据的拜访,进步计算机的处理速度,可是对齐会导致内存空间的糟蹋,这些糟蹋关于大内存空间的设备而言,没什么必要,可是关于嵌入式体系而言会形成许多的糟蹋。
在32bits的体系中对一个寄存器(32bits)的拜访直接拜访,可是关于寄存器中某一个字节的拜访反而觉得很不便利,因而假如仅仅单个字节的拜访反而增加了体系的担负。对一个寄存器的拜访可以经过一个开端地址来完成,可是咱们在许多CPU的用户手册中都会发现,寄存器的开端地址都能被4整除,这便是为了进步计算速度而采纳的一些默许的方法。一个寄存器一般来说占有4个bytes,那么对下一个寄存器的拜访只需求在本来的地址基础上加上4个 bytes即可。
对齐的根本效果便是进步体系的功用,特别是拜访存储器的才能得到进步。
对齐在运用中有较多的含义。根本的运用准则:
1、对齐是为了进步体系的拜访速度,一般根本的对齐准则是按着最大的根本类型的长度进行对齐,较小的元素可以几个组合起来填充一段对齐内存,完成根本的对齐,可是需求满意条件2。
2、结构体中的元素也要满意必定的散布条件,便是元素的存储开端地址要满意可以整除该元素类型的长度。
3、在结构体中存在结构体的情况下,也仅仅按着结构体中最大的根本类型长度对齐(包括内部结构体中的最大根本类型长度)。
在不同的编译器之间也存在必定的不同。在linux中最大的对齐长度是 4个字节,也便是假如结构体中的最大的根本类型长度是大于4的,那么也按着4对齐,一起不会按着结构体中最大的根本类型的长度对齐,伴随着最大根本类型元素的开端地址也不再满意可以被最大元素类型长度对齐的准则,而是满意整除4即可。但假如结构体中最大的根本类型长度小于4,那么按着最大的根本类型长度对齐
可是在windows中根本上都是按着最大的根本类型长度进行对齐,和一般的准则类似。
这边仅仅我的一些了解其间详细的要详细剖析,在实践中主张将最大根本类型的元素放在开端的当地,然后将其他的数据按着必定的规则(能否组合起来满意对齐条件等)界说结构体,这个规则要根据实践情况剖析。
下面经过根本的代码进行演示:
- #include
- #include
- struct aa{
- char a;
- double b;
- short c;
- };
- struct bb
- {
- doublea;
- short b;
- char c;
- };
- struct cc
- {
- struct bb s1;
- char s2;
- };
- struct dd
- {
- struct aa s1;
- char s2;
- };
- #pragma pack(1)
- struct ee
- {
- double a;
- short b;
- char c;
- };
- struct ff
- {
- char a;
- double b;
- short c;
- };
- #pragmapack()
- struct gg
- {
- char a;
- };
- struct jj
- {
- char a;
- short b;
- };
- intmain()
- {
- printf(“doublesize is %d %d %d”,sizeof(double),sizeof(short),sizeof(char));
- printf(“size of s1 = %dsize of s2 = %d”,sizeof(struct aa),sizeof(struct bb));
- printf(“size of t1 = %dsize of dd = %d”,sizeof(struct cc),sizeof(struct dd));
- printf(“size of struct ee = %dsize of struct ff = %dsize of struct gg = %dsize of struct jj = %d”,
- sizeof(struct ee),sizeof(struct ff),sizeof(struct gg),sizeof(struct jj));
- exit(0);
- }
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/317785.html