zoukankan      html  css  js  c++  java
  • 4-17疑难点 c语言之【结构体对齐】

      今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式

    例如:

     1 #include<stdio.h>
     2 struct test1
     3 {
     4     int a;
     5     char b;
     6     short c;
     7     double d;
     8 };
     9 int main()
    10 {
    11   printf("%d
    ",sizeof(struct test1));
    12 
    13   return 0;  
    14 }

      在这段程序中

      输出的并不是       15          //结构体集合内元素大小的简单相加

      而是        16      //此处就体现了在c语言结构体中内存开辟的原则  对齐原则

      结构体对齐: 以最大的基本元素的大小(除数组)对齐,以本段程序为例:

      1. 系统找到结构体内最大元素的大小(double的大小),并以此先开辟一个空间,此空间内存下double类型;

    1 2 3 4 5 6 7 8

    first

      2.再开辟一个最大元素的大小空间,依次找第二大的元素,并存入double大小的空间内,5678内存下int类型;

    1 2 3 4 5 6 7 8

    second

      3.余下的四个空间内能存入short,12内存下short类型;

    1 2 3 4 5 6 7 8

    second

      4.余下的两个空间内能存入char,4内存下char类型

      2 3 4 5 6 7 8

    second

    至此结构体内元素全部存完,一共开辟了两次也就是 16个字节的大小                                                 注:此处为什么int要存在5678,以及char存在4,这两个类型都不按顺序存储,有待研究。

    为什么当初c语言开发时结构体采取一个这样的方式进行存储?在查询一些资料后,我总结有以下原因:

    1. 提高cpu运算速度,一次性能读完一个元素。
    2. 平台原因,也就是移植原因,不是所有的硬件平台都能访问任意地址的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据的,否则就会硬件异常。
    3. 性能原因,数据结构(尤其是栈),应该尽可能在自然边界上对齐,因为在访问为对齐的内存时,处理器需要访问两次,而对齐的内存处理器只需要访问一次。

    2019-04-17 22:45:14 寝室随笔

  • 相关阅读:
    PHP引用与global操作符
    php关联数组与索引数组及其显示
    vim列模式
    PHP 魔术方法之__set() __get() 方法
    给图片、表格、公式自编号
    如何将本地项目与coding.net/github上的项目绑定
    用 ElementTree 在 Python 中解析 XML
    用 ElementTree 在 Python 中解析 XML
    正则表达式介绍
    一个javascript面试题解析
  • 原文地址:https://www.cnblogs.com/xgmzhna/p/10726805.html
Copyright © 2011-2022 走看看