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 寝室随笔

  • 相关阅读:
    jmter录制脚本、代理配置和操作
    Jmeter服务器性能压测之—QPS/RPS/TPS/RT/并发数/并发连接数/并发用户数/线程数/吞吐量等概念详解
    Chales 抓https 显示Unknown
    转:Jmeter-场景执行与结果收集、分析
    转:Jmeter-使用Stepping Thread Group插件来设置负载场景
    Jmeter ServerAgent
    AWVS13 破解
    Jenkins 配置邮箱服务器
    Linux + Jenkins + Jmeter
    系统故障处理
  • 原文地址:https://www.cnblogs.com/xgmzhna/p/10726805.html
Copyright © 2011-2022 走看看