结构体对齐及大小端分析

剖析结构体大小端 结构体 1.概念 1.结构体:描述一个事物,问题的一系列数据的集合. 例: struct person { char name[20]; int year; int class; int phone; char addr; }; 2.作用 1.内置类型无法描述需要表述的事物,问题时就会定义结构体 2.返回的参数不只是一个而是一个集... 阅读详情

结构体怎么对齐?

  • 结构体对齐规则:
    • 第一个成员在结构体地址偏移量为0的地址处

    • 其余成员变量要在某个数字的整数倍处(对齐数)的地址
      注意:对齐数为编译器默认的数值与该成员中较小的值
      vs下默认的对齐数是8 gcc下默认的对齐数是4

    • 结构体总大小为:最大对齐数(所有变量的最大者与编译器默认的对齐参数取最小)的整数倍

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

那么为什么要有内存对齐?

  • 平台原因(移植原因):不是所有的平台都支持访问任意地址的任意数据的,某些硬件只能处理某些特定类型的数据,否则会抛出硬件异常
  • 性能原因:数据结构(尤其是栈)应尽量向自然边界对齐,原因是处理器要想访问未对齐的数据需要操作两次内存访问,而对于对齐的数据只需一次内存访问就可以获取到
    总体来说:内存对齐是空间换时间的做法

如何让结构体进行指定参数的对齐?

  • #pragma 这个预处理指令可以改变默认的对齐参数
    #pragma pack() 还原默认的对齐数 ,#pragma pack(1)设置为8
    #pragma pack(8)设置为8,#pragma pack(4)设置为4
#pragma pack()
struct 
{
    结构体成员变量/函数
}
#pragma pack()
//默认对齐数不一定是最终的对齐数,这要遵循结构体对齐规则

如何知道结构体成员中某个结构体成员相对结构体起始位置的偏移量

  • offsetof宏的实现可用来解决 (在不知结构体成员位于那些成员之后和不知结构体地址的情况)
#include<stdio.h>
#include<stddef.h>
#include<stdlib.h>

struct student
{
   int a;
   char b;
   double c;
}student;

int main()
{
   printf("student b is %d\n", (int)offsetof(struct student, b));
   system("pause");
   return 0;
}

什么是大小端?

  • 大端(Big-Endian):数据的低字节保存在内存的高地址中,高字节保存在内存的低地址中
  • 小段(Little-Endian):数据的低字节保存在内存的低地址中,高字节保存在内存的高地址中
  • 为什么要有大小端?
    • 因为在计算机系统中是以字节为单位的,每个地址单元对应一个字节,但在c语言中,除了char是一个字节外,其余的像short是两个字节的,int是4个字节的,long在32位系统是4个字节,64位系统下是8个字节,double在32位系统下为8个字节,在64位系统下为16个字节,由于寄存器的宽度大于一个字节,因此在存储时必然就存在如何存储的问题,也就产生了大小端的存储方式
      大小端的优势对比:
      大端:顺序存储,符合人们阅读的习惯,符号位保存在第一个字节中,便于判断数据正负
      小端:1.因为小端是由低地址存放低位,因此在强制类型转换上不用调节字节内容。2.CPU在做数值运算的时候,是由低位到高位读取数据运算,直到刷新到最到位,这样的话在运算方式会更高效

如何测试某台机器是大端还是小端?

  • 使用强制转换操作判断
    • int i = 1,使i强制转换类型为char的指针再进行解引用,如果&1结果为1则为小端,否则为大端
#include<iostream>
using namespace std;

int main()
{
	int i = 1;
	if (*(char *)&i == 1)
	{
		cout << "小端模式" << endl;
	}
	else{
		cout << "大端模式" << endl;
	}
	return 0;
}  

在这里插入图片描述
VS下运行结果

  • 使用联合体
    • 创建联合体{int i ;char j} ,给i赋值1;打印b的数值;如果为1则是小端,否则为大端
#include<iostream>
using namespace std;

union
{
	int i;
	char b;
}un;

int main()
{
	un.i = 1;
	if (un.b == 1)
	{
		cout << "小端模式" << endl;
	}
	else{
		cout << "大端模式" << endl;
	}
	return 0;
}

在这里插入图片描述
VS下运行结果

大小端的应用场景是什么?

  • Intel的80×86系列芯片使用小端存储模式
    ARM芯片默认采用小端,但可以切换为大端
    MIPS芯片采用大端,但可以在大小端之间切换
    在网络上传输的数据普遍采用的都是大端
C#中如何使用DataGridView绑定数据源显示数据 1.在窗体上添加DataGridView控件,选中控件右上角的小三角形 2.点击选中数据源——添加项目数据源 3.选择数据源类型,在这里我用到的是数据库 4.选择数据库模型,这里面只显示了一个数据集,选择数据集,然后下一步 5. 点击新建连接 6.选择数据源,我选择的是sql server 7. 添加连接,选择你的服务器名称,输入用户名和密码,选择数据库名称,点击连接测试,测试成功即可 8.选择数据库对象,在这里我需要查询上机信息,就勾选Line_Info表... 阅读详情

相关推荐

【控件操作】DataGridView绑定数据源

DataGridView绑定数据源的步骤。

郑晓东 廊坊师范学院信息技术提高班 十二期 3653

结构体大小端字节序】

自定义类型包括:结构体,枚举,联合体 结构是一些值的集合,这些值被称为成员变量.结构的每个成员可以是不同类型的变量.但反过来说结构体就是一个独立的变量,它是一个自定制类型. 结构体声明struct tag{member -list;}variable -list; 结构体内引用自身需要用到结构体指针 结构体一般定义方法举例typedef struct s1{int x;int y; }p1; 结...

qq_41016462的博客 5941

图片数据爬取工具Image-Downloader的安装和使用

文章目录1、python安装2、下载chromedriver并配置3、下载phantomjs并配置.4、安装相关python库5、使用 安装包地址:https://github.com/sczhengyabin/Image-Downloader 下载: 方式一:打开cmd,输入: git clone https://github.com/sczhengyabin/Image-Downloader.git 方式二:打开网址 1、python安装 该数据爬取工具要求python>=3.5,由于

wxplol的博客 6647

大小端模式和结构体中成员变量的内存分布

一.大端模式和小端模式 计算机系统中,每个地址单元对应一个字节(8bit),一种数据类型可能占用多个字节,如何安排这种数据类型中的每个字节,哪个字节在低地址,哪个在高地址,以及每个字节中比特序在内存中的位置,这就涉及到大小端模式。一般情况下,字节序和比特序的排列规则是一致的。我们在书写和计算中数据数据分为高位和低位,高位在左边,低位在右边,例如0x6401中,0x64为高位,0x01为低位。 ...

justkong的博客 5539

结构体中的位域和大小(字节大小端、位大小端)

1. 结构体中元素的地址 我们知道,结构体一般包括很多元素,结构体的大小为所有元素的大小总和(包括字节对齐)。 那么在结构体中,不同元素之间的地址相对位置是什么关系呢? 是先定义的元素地址在低地址还是后定义的元素地址在低地址呢? 我们通过一段代码来测试一下(我电脑型号为R9000P,AMD处理器,x86架构,win10操作系统,DevC++) #include <stdio.h> typedef struct { int a; int b; }Test; Test test1; int m.

qq_41854911的博客 4525

什么是大小端,数组大小端,位域大小端结构体大小端

什么是大小端,数组大小端,位域大小端结构体大小端

linux,单片机,杂记 5278

C# 窗体应用 DataGridView 使用对象绑定数据源

C# 窗体应用 DataGridView 使用对象绑定数据源 前言 第一次发文,希望大家能够支持。???? 第一步 最近遇到一个项目,需要用到C# 窗体应用的DataGridView,遇到几个问题,写下来让大家成功避免踩雷 第一步,创建C#窗体文件,(会的同学自觉忽略,会创建的同学直接跳到第六步,不会的小新也不要紧哦) 第二步 第二步,会生成一个窗体视图(如下图) 第三步 选择视图,工具箱(左方有快捷方式的忽视) 第四步 找到DataGridView控件,拖到Form1里面 第五步 创建对象类

qq_46104786的博客 1万+

C# DataGridView绑定数据源的几种常见方式

目录 1. 简单的数据绑定 2. 复杂数据绑定 3. 实例 3.1 手动给dataGridView绑定数据源的方法 3.2 利用泛型集合向DataGridView中添加数据 List<>泛型集合: Dictionary<>泛型集合 3.3 利用SqlDataReader填充DataGridView 3.4 利用SqlDataAdapter对象向Da...

weixin_38871681的博客 3974

vb.net中将DataGridView与数据源绑定

DataGridView绑定数据源

只布布倩 1万+

结构体齐及联合体+大小端总结

一,结构体 概念:是一种新的自定义类型,由一组成员的不同数据组成的,每个成员都可以具有不同的数据类型,通常来表示类型不同但是又有 相关的若干数据。 例如:一个表示学生的结构体中有:char类型的学生名字,int类型的年龄等等。 struct Student { char name[20]; char gender[3]; int age; double hegiht; }; printf("%d\n", sizeof(struct Student)); //在使用是必须加上struct s.

cj213的博客 1320

3. 结构体位域大小端总结

结构体内部如果是位域操作,在不同的平台也有大小端的问题。 1. 案例一分析 小端格式 大端格式 typedef struct yaabou_com { int a : 1; ...

zuo_an的博客 1万+

大小端转换定义结构体的技巧

这两年一直在写协议分析和报文填充相关内容。因为PC机是小端(Little Endian),网络序是大端(Big Endian),在写代码的时候必须考虑到大小端转换的问题,否则网卡或者网络设备会解析错误。网上的总结分析甚少,大部分都还处于纠结于大小尾分辨的状态

algebra007的博客 6650

C语言高级-内存解读+字符串+结构体+共用体+大小端+枚举

C语言高级-内存解读+字符串+结构体+数组+共用体+

钟浩森的博客 1520

C++之结构体、共用体和大小端

文章目录: 结构体结构体是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。 结构体变量的声明: (1)先定义结构体类型,再定义结构体变量 struct student{ char name[20]; char sex; long num; float score[3]; }; struct student stu1,stu2; 利用这种定义形式,可以在程序的任何地方,在先定义后使用的原则下,定义属于该结构体类型的变量 (2)定义结构体类型同时定义结构体变量 struct stude

有梦想的小新人的博客 1441

大小端结构体释疑

本人在做项目过程中需要在ARM对从FPGA读取到的数据进行处理,在实际过程中产生了一些问题,在思考了后记录在此。 1 大小端模式 大小端指数据在内存中的存储方式。小端指数据的高字节保存在内存的高地址处,低字节保存在内存的低地址处。大端模式则正好相反。ARM和x86的CPU一般情况下都为小端模式。 对于值unsigned int value = 0x12345678,在内存中的存储方式如下。 内存地址 小端模式存放内容 大端模式存放内容 0x00004000 0x78 0x12 0.

asd1147170607的博客 2100

结构体内存对齐和大小端

结构体怎么对齐? 1.第一个成员与结构体变量偏移量为0的地址处开始数 2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处 注意:对齐数,VS中是8,linux中是4 3.结构体的总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数 )的整数倍 4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的 整数倍处,结构体的整体大小就是所有最大对齐数 (含嵌套结构体的...

qq_41148509的博客 1115

C++结构体struct的对齐规则及联合体union大小端

1.什么是结构体对齐?为什么要进行结构体的对齐 2.如何计算? 3.结构体和联合体的区别

zzzz_yu的博客 1330

【C】结构体内存对齐和大小端存储

结构体内存对齐的核心是空间换效率,理解对齐规则有助于优化内存布局。通过合理排列成员、利用编译指令和工具验证,可以在内存占用和性能之间找到平衡。

yishaobai的博客 1145

struct 字节对齐详解与大小端模式

一.什么是字节对齐,为什么要对齐?     现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。     对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据

inuyashaw的博客 6410

linux入侵排查-综合日志分析

2.分析攻击者首次成功登录web管理后台的时间 还可以知道攻击者可能是通过10.2.4.11这个跳板服务器跳过来的,然后我们继续排查,可以发现日志中POST请求大多都是1047字节,然后往后大多是300字节,POST请求的响应状态码有200和302这两个,其中的302是爆破成功后持续爆破产生的日志,再1047字节和300字节中间夹着一个978字节,就是200响应和302响应的中间。7.分析攻击者留下的持久化后门的时间和后门执行情况 排查计划任务,发现有一个计划任务还是被加密的,应该是反弹shell的。

chinese_cabbage0的博客 620

2004-2024年HS编码出口退税率数据-最新出炉.zip

一、资源特点全新力作:今年精心打造,人工细细打磨,品质上乘。权威精准:数据来源,准确靠谱,值得信赖。品质无忧:绝无数据造假,品质有保障,放心使用。二、适用人群学生:在校专科生、本科生、研究生,助力学业各个环节。教研人员:大学教师和学术科研工作者,为教学科研添力。三、适用专业社科经济:经济学、社会学专业适用。规划管理:地理学、城市规划,以及商业、工商管理专业皆可使用。

上一篇: linux常用工具和gcc编译器
下一篇: linux make详解及进度条小程序
Xiao7858
博客等级 码龄8年 1粉丝 6原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值