结构体为什么要存在内存对齐

结构体的自引用 

  在结构体中包含一个类型为该结构体本身的成员称为结构体的自应用

 


引用方式:

typedef struct Node{

    int data;

    struct Node* next;

}s;

(s在这块是全局变量)

结构体的定义和初始化


struct s{

  char c;

  int a;

  double d;

  char arr[20];

};

void main(){

  struct s t = { 'c' , 100 , 3.14 , "hello world"};

}

结构体内存对齐


 

计算结构体的大小:有以下代码:

 

 

 结构体对齐规则:1、第一个成员在与结构体变量偏移量为0的地址(就是第一个成员的在内存中随便找一个地址)

        2、其他成员变量要对齐到某个数字(对齐数)整数倍的地址处

对齐数=编译器默认的一个对齐数该成员大小较小值

        3、结构体总大小为最大对齐数(每一个成员都有一个对齐数)的整数倍

         4、如果是嵌套结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数的整数倍

VS编译器的默认对齐数=8,gcc中没有对齐数的概念。

嵌套结构体求内存对齐有以下程序:

 


 

为什么存在内存对齐? 

    1、平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

    2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐,原因在于,为了访问未对齐的内存,处理器需要作两次内存访问,而对齐的内存访问仅需求一次访问。

总体来说:

      结构体的内存对齐是拿空间来换取时间的做法。(对于数据能一次性的拿去完整)

因此,设计存放的时候也是需要一定的技巧:应该让占用空间下的成员尽量集中在一起

推荐这些技术文章:

结构体成员在内存中的对齐方式

知识的搬运工如下:
  文章1
  文章2
  文章3

如果,感到此时的自己很辛苦,那告诉自己:容易走的都是下坡路。坚持住,因为你正在走上坡路,走过去,你就一定会有进步。如果,你正在埋怨命运不眷顾,开导自己:命,是失败者的借口;运,是成功者的谦词。命运从来都是掌握在自己的手中,埋怨,只是一种懦弱的表现;努力,才是人生的态度。

...

结构体类型的存储大小

#include <stdio.h>struct S1{ char c1; int a; char c2;};
struct S2{ char c1; char c2; int a;};
 
struct S3
{
double b;char c1;int a;};
 
struct S4
{
double b;struct S2;int a;};
int mai...

计算机最小单位,和结构体占用字节大小分析(内存对齐)

文档查询 :https://golang.google.cn/pkg/strconv/  
GO的编码为UTF-8编码
计算机的基本的存储单元有:
   位(bit):二进制数中的一个数位,可以是0或者1,是计算机中数据的最小单位。二进制的一个“0”或一个“1”叫一位。
   字节(Byte,B):计算机中数据的基本单位,每8位组成一个字节。各种信息在计算...

C/C++ 结构体内存分布

参考文章:C++中的结构体所占内存空间总结 - fengMisaka - 博客园 (cnblogs.com)
在C C++中,一般情况下。struct 的 sizeof 是所有成员字节对齐后长度相加,而 union 的 sizeof 是取最大的成员长度,再相加。
 
字节对齐的细节和编译器实现相关,但一般而言,满足以下3个准则:
(1) 结构体变量的首地址能够被其最宽基本类型成员的大小...

内核crash (Linux)

转载自:http://linux.cn/article-3475-1.html
 
在工作中经常会遇到一些内核crash的情况,本文就是根据内核出现crash后的打印信息,对其进行了分析,使用的内核版本为:Linux2.6.32。
       每一个进程的生命周期内,其生命周期的范围为几毫秒到几个月。一般都是和内核有交互,例如用户空间程序使用系...

JVM垃圾回收与调优详解

1.JVM内存分配与回收
1.1 对象优先在Eden区分配
大多数情况下,对象在新生代中 Eden 区分配。当 Eden 区没有足够空间进行分配时,虚拟机将发起一次Minor GC。我们来进行实际测试一下。
在测试之前我们先来看看 Minor Gc和Full GC 有什么不同呢?
 新生代GC(Minor GC):指发生新生代的的垃圾收集动作,Minor GC非常频繁,回收速度一般也比...

Java 基础面试题

1.JDK和JRE的区别?

JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。

2.==和equals的区别?

基本类型:比较的是值是否相同;
引用类型:比较的是引用是否相同;

String st...

iOS底层原理02-alloc源码分析

   首先,从最熟悉的入手 - 对象,看看这三个对象的内容,内存地址和指针地址。
    LGPerson *p1 = [LGPerson alloc];    LGPerson *p2 = [p1 init];    LGPerson *p3 = [p1 init]; &nb...

#pragma pack() -----设置默认对齐数

#pragma pack()  -----设置默认对齐数

 
预处理命令#pragma:程序如下
 
 
 则根据修改的对齐数来算:则需要占据内存的大小是14

 

 如果不进行设置,则按照编译器默认的对齐数来算:则需要占据的内存的大小是16
offsetof();结构体成员相对于第一个成员的偏移量
函数格式:size_t...

结构体内存对齐

一 结构体内存对齐原因
1.平台原因(移植原因):
“不是所有的硬件平台都能访问任意地址上的任意数据;某些硬件平台只能在某些特定地址处取某些特定的数据,否则就会抛出硬件异常”。也就是说在计算机在内存读取数据时,只能在规定的地址处读数据,而不是内存中任意地址都是可以读取的。
2.效率原因:
正是由于只能在特定的地址处读取数据,所以在访问一些数据时,对于访问未对齐的内存,处理器需要进行两次访问;而对...

文章标题:结构体为什么要存在内存对齐
文章链接:https://www.dianjilingqu.com/480.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>