美文网首页
内存对齐,大端字节 序小端字节序验证

内存对齐,大端字节 序小端字节序验证

作者: RainingMan | 来源:发表于2017-03-19 22:11 被阅读0次

本文为转载,原文地址:http://11142019.blog.51cto.com/11132019/1766032

空结构体:对于空结构体,就是只有结构体这个模子,但里面却没有元素的结构体。
例:

typedef struct student
{
}std;

这种空结构体的模子占一个字节,sizeof(std)=1。

柔性数组:
结构体中最后一个元素可以是一个大小未知的数组,称作柔性数组成员,规定柔性数组前面至少有一个元素.

typedef struct student
{
int i;
char arr[];     //柔性数组成员
}std;
sizeof(std)=4;

sizeof求取该结构体大小是不包含柔性数组的大小,柔性数组不管有没有大小都不计入结构体的大小,可以通过动态内存为它实现内存分配。

内存对齐:
对于字(自然边界是偶数地址),双字(自然边界是能被4整除的地址),四字(自然边界是能被8整除的地址)本身就是对齐的。为什么要对齐呢?这是因为对于对齐的内存只需要一次内存访问,对于未对齐的内存,处理器要两次内存访问。

未对齐:一个字或者双字跨越了4字节边界,或者双字跨越了8字节边界,需要两次内存访问。

对于结构体,联合体在计算其大小时要考虑其内存对齐,以结构中所占字节数最大的类型类型对齐。
例:

struct test
{
    char a1;
    short b2;
    char  c3;
    int d4;
};

因为其中int类型所占字节最多,所以以4字节对齐,内存分配方式如下,总共占12个字节:

分析:因为以4字节对齐,首先char a1占一个字节存到00处,short b2 是字占两个字节 ,以偶数地址对齐,所以不能直接存到01 02 上,而应该存到02 03上,而空出来的01就会被浪费掉。同理,当char c3存到04上后,对于int i,双字必须要存到4的倍数的地址上,就只能存到08 09 0a 0b上,空出来的05 06 07会被浪费掉。

struct test
{
    char a1;
    char  c3;
    short b2;  
    int d4;
};

同样的,以4字节对齐,总共占8个字节:
这是因为a1存到00,c3存到01,b2刚好存到02 03上,以偶数地址对齐,d4也刚好从04开始存储,以4字节对齐,没有浪费内存。

大端字节序:高字节存储在低地址,低字节存储在高字节处
小端字节序:低字节存储在低地址,高字节存储在高地址处
计算机的最小存储单位是字节,一个字节占8bit位。
以int为例:
例如:1的二进制码是
00000000 00000000 00000000 00000001
写成十六进制形式 :00 00 00 01这就代表了4个字节,而内存是从低地址到高地址的,这样就产生了两种存储方式。

因为存储方式方式的不同,读取时也就产生了两种方式。
一般读取是从低地址向高地址读取,为了将存储与读取统一取来,所以采用小端存储,这样的话,低字节存到低地址,高字节存到高地址。
验证方法:
1、可以声明一个int a=1,再声明一个char *p=&a;因为a占4个字节,char 一次向后访问一个字节,所以如果是小端的话在电脑上输出p应该是1.
2、也可以用union,因为union是内存公用,所以声明一个int a,char c;对a赋值为1,输出c观察结果。
有些问题如果不考虑大小端的话是根本想不明白的。

相关文章

  • 内存对齐,大端字节 序小端字节序验证

    本文为转载,原文地址:http://11142019.blog.51cto.com/11132019/176603...

  • 内存序、字面量、动态规划

    内存字节序 确认内存字节序 /* 确定你的电脑是大端字节序还是小端字节序 */include int check...

  • 字节序

    端模式分为小端字节序与大端字节序。 1. 小端字节序(Little Endian, LE)低字节存于内存低地址,高...

  • 字节对齐与大端小端与内存区域划分

    字节对齐 C语言字节对齐C语言字节对齐/7213465 大端小端 字节序(大小端)详解从高低地址和高低位开始理解(...

  • socket编程基础

    字节序 字节序分为大端字节序和小端字节序大端字节序: 是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内...

  • 简单程序判断大端小端

    小端和大端的区别:描述多字节变量在内存中的存放方向;小端就是低序字节放在高位地址,大端则相反; 验证程序: 原理

  • C语言进阶

    字节序 由于历史原因,业界存在两种字节序标准,大字序(大端)和小字序(小端);大字序,高字节存在低地址;小字序,高...

  • 网络通信大端小端转换

    1、 使用说明 大端又叫网络字节序,小端又叫主机字节序,在网络通信传输数据时候,通常是采用大端对齐方式,而在本机电...

  • Linux的socket API基本操作

    1.socket地址API 主机字节序和网络字节序 字节序分为大端字节序和小端字节序 大端字节序 = 一个整数的高...

  • (转)字节序、大端序与小端序及其相关转换

    字节序、大端序与小端序及其相关转换https://blog.csdn.net/SwordArcher/articl...

网友评论

      本文标题:内存对齐,大端字节 序小端字节序验证

      本文链接:https://www.haomeiwen.com/subject/rfbvnttx.html