结构体(对齐规则及举例)

2023-05-16

概念

  1. 一种数据结构;
  2. C语言中聚合数据类型的一类;
  3. 可以被声明为变量、数组、指针等,用以实现比较复杂的数据结构;
  4. 是一系列元素的集合,这些元素被称为结构体成员;
  5. 结构体成员需要用结构体名访问。

结构体声明

struct A{  //struct是关键字, A是结构体标志
    int a; //a,b是结构体成员列表
    char b;
}s1;       //s1是结构体变量

注意事项:

  • 一般情况下,声明出现三个部分的两个部分即可(标志或者变量可省略)
  • 结构体可以包含其他结构体,也可以包含指向自己的指针
  • 结构体互相包含时,需要对其中一个进行不完整声明

结构体对齐规则

  • 计算结构体大小不是元素单纯相加;
  • 32位CPU取四个字节比一个字节更高效方便;
  • 若每个元素首地址都是4的整数倍,取数据元素就能更高效方便;
  • 每个特定平台上编译器都有自己的默认的对齐系数(对齐模数),可通过编译命令来改变这一系数;
  • #pragma pack(n);//n=1,2,4,8,16,其中n就是你想要指定的系数。
  • 一般情况下32位默认4字节对齐。

对齐原因

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

  2. 性能原因
    数据结构(尤其是栈),应该尽可能在自然边界上对齐,因为在访问为对齐的内存时,处理器需要访问两次,而对齐的内存处理器只需要访问一次。

对齐规则

  1. 第一个成员在与结构体变量偏移量(offset)为0的地址处。
  2. 其他成员变量要对齐到对齐数的整数倍的地址处。
    1. 对齐数 = 对齐系数 与 该成员大小的较小值。
    2. #pragma pack(n);中的n就是对齐系数。
    3. VS中默认的值为8;linux中的默认值为4。
  3. 结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
举例说明对齐原则
1.下面的结构体大小分别是多大(假设32位机器)?
struct A {
char a; //1
char b; //1
char c; //1
};
//进行整体对齐,最大类型为1<对齐系数4,按1整体对齐,所以1+1+1=3 
struct B {
int a;  //4
char b; //1
short c;//2
};
//进行整体对齐,最大类型为4=对齐系数4,所以按4整体对齐4 1+2=3<4 对齐4 所以4+4=8 
struct C {
char b; //1
int a;  //4
short c;//2
};
//进行整体对齐,最大类型为4=对齐系数4,所以按4整体对齐 1<4(对齐4) 4=4 2<4(对齐4)  所以4+4+4=12 
#pragma pack(2)
struct D {
char b; //1
int a;  //4
short c;//2
};
//进行整体对齐,最大类型为4>对齐系数n(2),所以按2整体对齐 1<2(对齐2)4>2(2的倍数) 2=2 所以2+4+2=8 
答案及解析:3 8 12 8


2. 有一个如下的结构体:
struct A{
 long a1;
 short a2;
 int a3;
 int *a4;
};
请问在64位编译器下用sizeof(struct A)计算出的大小是多少?
24
28
16
18

答案及解析:24
64位编译器下:指针8字节(一定不能忘记),题目不说默认4字节对齐
long a1;    //8
 short a2;  //2 8+2=10(不是4的倍数)对齐到4的倍数12
 int a3;    //4 4+12=16(4的倍数)
 int *a4;   //8 8+16=24(4的倍数)




3.在32位cpu上选择缺省对齐的情况下,有如下结构体定义:
struct A{
    unsigned a : 19;
    unsigned b : 11;
    unsigned c : 4;
    unsigned d : 29;
    char index;
};
则sizeof(struct A)的值为()
9
12
16
20

答案及解析16
题目不说,默认4字节对齐
19+11=30<32bit     4
4+29=33>32bit      4+4
1byte=8bit         1  对齐到 4
4+4+4+4=16

C++中的结构体struct---类

  • 在C++中struct是对于C语言中struct的扩展,因为C++是面向对象的语言,可以描述对象的行为,所以在C++中struct内可以放函数,从而就具有类的功能,但又和class有一定的区别。

class和struct的区别

  • class默认成员是私有的private,struct默认成员是公有的public
  • class继承默认是私有的private,struct继承默认是公有的public
  • C++中结构体可以不要struct关键字,C语言中除了typedef定义别名之外是必须要struct关键字。

转载于:https://www.cnblogs.com/wsq-888/p/jie-gou-ti-dui-qi-gui-ze-ji-ju-li.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构体(对齐规则及举例) 的相关文章

  • XML CDATA是什么?

    解析数据 XML 解析器通常情况下会处理XML文档中的所有文本 当XML元素被解析的时候 xff0c XML元素内部的文本也会被解析 lt message gt This text is also parsed lt message gt
  • TCP端口同时做服务器与客户端

    下面的代码主要实现两个功能 xff1a 1 xff0c 通过bind使本机指定端口如2012端口与远端服务器通信 xff0c 不指定的话会随机分配 2 xff0c 然后使用该指定端口创建监听服务 xff0c 接受其他客户端的连接 主要方法用
  • bat脚本禁用和开启本地连接

    netsh interface set interface name 61 34 本地连接 34 admin 61 disabled 禁用本地连接 netsh interface set interface name 61 34 本地连接
  • 一个PHP的QRcode类,与大家分享

    类的代码 View Code lt php eval gzinflate base64 decode 39 7X1td9s2svDn3nP2PzBZNZJiKRb1ZtmxvY 43 bOE3u2o5rp9u7N5v1oSTaZqO3UHQ
  • Java程序员的黄金5年,从入行到大牛的晋升之路

    在程序界流行着一种默认的说法叫 黄金5年 xff0c 也就是一个程序员从入职的时候算起 xff0c 前五年的选择直接影响着整个职业生涯中的职业发展方向和薪资走向 xff0c 如何走好这5年 xff0c 彻底从一个刚入行的菜鸟蜕变成可以以不变
  • Gin 框架的路由结构浅析

    Gin 是 go 语言的一款轻量级框架 xff0c 风格简单朴素 xff0c 支持中间件 xff0c 动态路由等功能 gin项目github地址 路由是web框架的核心功能 在没有读过 gin 的代码之前 xff0c 在我眼里的路由实现是这
  • 红米手机5 Plus启用root超级权限的步骤

    红米手机5 Plus怎么开启root超级权限 xff1f 做开发的人清楚 xff0c Android机器有root超级权限 xff0c 一旦手机开启root相关权限 xff0c 就可以实现更强的功能 xff0c 举个栗子做开发的人企业的营销
  • 基于vue解决大数据表格卡顿问题

    点我在线体验Demo 请用电脑查看 亲测苹果电脑 xff0c chrome浏览器无卡顿现象 xff0c 其它浏览器并未测试 xff0c 如遇到卡顿请备注系统和浏览器 xff0c 方便我后续优化 xff0c 谢谢 先看一下效果 一共1000
  • raid1损坏一块盘之后的处理方式

    在企业生产环境中 xff0c 假如raid1两块盘中的一块损坏了 xff0c 后续如何处理 xff1f 直接换下损坏的磁盘是否会对服务有影响 xff08 如何把影响降到最低 xff09 xff0c 加入新的磁盘后是否还需要重新做raid1
  • Landsat Tm5辐射定标和大气校正(转)

    一 辐射定标 1 由于ENVI 4 4 中有专门进行辐射定标的模块 xff0c 因此实际的操作十分简单 将原始TM 影像打开以后 xff0c 选择 Basic Tools Preprocessing Calibration Utilitie
  • Traversing the Dept Security tree

    We can use the connect by prior function provided by Oracle to traverse the Dept security Tree Suppose an Organization h
  • Reconfigurable computing[可重构计算]

    在实验室跟老师做一些硬件加速相关的东西 xff0c 看文献时看到Reconfigurable computing xff0c 发现这个很有意思 现在每天都有越来越多的数据产生 xff0c 要处理这些数据如果单纯用CPU计算的话会耗费很多时间
  • 嵌入式作业STM32采用串口DMA方式发送数据

    目录 前言 要求 一 DMA的基本介绍 DMA的基本定义 DMA的主要特征 STM32F411x系列芯片DMA控制器 二 通过CubeMX配置项目 1 创建项目 2 选择芯片STM32F103C8T6 3 设置RCC 4 设置串口 5 设置
  • C ~ char int 等数据转换问题

    1 xff0c char型数字转换为int型 char a 61 34 32 34 printf 34 d n 34 a 0 39 0 39 输出结果为3 2 xff0c int转化为char 1 字符串转换成数字 xff0c 用atoi
  • curl get请求添加header头信息

    function get url ch 61 curl init curl setopt ch CURLOPT HTTPGET true curl setopt ch CURLOPT RETURNTRANSFER 1 TRUE 将curl
  • 关于 RESTFUL API 安全认证方式的一些总结

    常用认证方式 在之前的文章 REST API 安全设计指南 与 使用 AngularJS amp NodeJS 实现基于 token 的认证应用 两篇文章中 xff0c 译 web权限验证方法说明 中也详细介绍 xff0c 一般基于REST
  • C++ REST SDK的基本用法

    微软开发了一个开源跨平台的http库 C 43 43 REST SDK xff08 http casablanca codeplex com xff09 xff0c 又名卡萨布兰卡Casablanca xff0c 有个电影也叫这个名字 xf
  • ubuntu下socket通信

    之前的博文介绍了如何在ubuntu下实现unix domain socket通信 xff0c 但只是本地的通信 xff0c 虽然过程和网络通信很类似 xff0c 但这里还是有必要了解下真正的socket通信 首先贴出server端的c代码
  • c语言中宏定义中void,C语言中宏定义几道问题!

    C语言中宏定义几道问题 xff01 答案 1 信息版本 xff1a 手机版 解决时间 2020 04 27 20 44 已解决 2020 04 27 17 15 一 执行下列程序 define MA x y x y k 61 5 k 61
  • IE浏览器自动配置脚本的使用(代理上网)

    以前在FireFox中设置过代理服务器自动配置脚本 xff0c 对于访问某些无法访问的网站非常有效 xff0c 在IE中应该也是有效的 xff0c 但是我配置了好几次都没有配置成功 xff0c 今天发现原来是格式错误 xff0c 修改了一下

随机推荐

  • c语言中通过指针将数值赋值到制定内存地址

    1 一种直观的方法 假设现在需要往内存0x12ff7c地址上存入一个整型数0x100 我们怎么才能做到呢 xff1f 我们知道可以通过一个指针 向其指向的内存地址写入 数据 xff0c 那么这里的内存地址0x12ff7c其本质不就是一个指针
  • 一个封装HTTP请求的函数(C++)

    这里封装 了HTTP请求的 xff0c 支持GET与POST xff0c 并支持各种参数组合 xff0c 调用方式很简单 使用DEVWEB WebRequest string http www luaie com ret 就可以了 如果使用
  • c++ vector 用法总结

    vector 是向量类型 xff0c 它可以容纳许多类型的数据 xff0c 如若干个整数 xff0c 所以称其为容器 vector 是C 43 43 STL的一个重要成员 xff0c 使用它时需要包含头文件 xff1a include lt
  • ubuntu命令行语法_HTTPie:超爽的HTTP命令行客户端

    之前在命令行下进行HTTP服务的调试和信息查看都是使用经典的cURL xff0c 不过前段时间发现一个交互更加友好的工具 xff0c 就是HTTPie 先放一个HTTPie官方的一个HTTPie VS cURL的图给大家看看 如果你经常需要
  • 如何用c语言串口通讯,串口通信入门

    在讲解本章的内容之前请大家先反复阅读 手把手教你学51单片机 文档的第11章内容 xff0c 很多概念文档都已详细讲解有 1 波特率 串口通信就是单片机与电脑端 xff0c 单片机与单片机 xff0c 单片机与模块器件之间互发信息进行通信
  • php和js区别

    php和js区别 两者在语法上类似 xff0c 楼上说的对 xff0c js 61 javascript是工作在浏览器端的脚本语言 xff0c 他所提交的数据是交给浏览器来处理的 但是现在的Ajax技术已经可以把js提交的数据交付到浏览器来
  • web前端利用turf.js生成等值线、等值面

    样例如下 xff1a lt DOCTYPE html gt lt html xmlns 61 34 http www w3 org 1999 xhtml 34 gt lt head gt lt meta http equiv 61 34 C
  • python模块名和文件名冲突解决

    对于python初学者 xff0c 很容易练习到一个随机数生成的程序 xff0c 代码如下 xff1a 1 usr bin python 2 import random 3 print random randint 12 20 这个小程序最
  • python3 logging 'ascii' codec can't encode characters

    环境 xff1a mac 10 12 python3 django 1 10 问题发现 最近刚从arch 换到 mac下搬砖 xff0c 发现在arch跑的好好的代码 xff0c 在mac下 终端老是报错 还是编码错误 code try i
  • Hutool之文件工具——FileUtil

    为什么80 的码农都做不了架构师 xff1f gt gt gt 简介 我想在Java工具中 xff0c 文件操作应该也是使用相当频繁的 xff0c 但是Java对文件的操作由于牵涉到流 xff0c 所以较为繁琐 xff0c 各种Stream
  • java中数字与ASCII码的相互转换

    2019独角兽企业重金招聘Python工程师标准 gt gt gt code 测试demo public static void main String args int a 61 91151561 for byte b String va
  • IDEA怎么查看现在的项目使用的JDK版本? 2016年4月19日22:51

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 右键单击项目 xff0c 选择 或者直接使用F4 转载于 https my oschina net sprouting blog 670222
  • 什么是北向接口和南向接口

    Northbound Interface Southbound Interface 南向接口 xff1a 管理其他厂家网管或设备的接口 xff0c 即向下提供的接口 北向接口 xff1a 提供给其他厂家或运营商进行接入和管理的接口 xff0
  • 官网下载mysql源码

    官网下载mysql源码 xff0c 如下为具体步骤 xff1a 1 进入官网点击download页https www mysql com downloads 2 点击MySQL Community Edition进入mysql社区版下载页面
  • Vue设置button的disable属性

    表单元素有一个disable属性 xff0c 用来控制该元素是否可用 1 这个属性在HTML里只有1个值 xff0c 用法就是 lt button disable 61 34 disable 34 gt 点击 lt button gt 经实
  • 用C++进行简单的文件I/O操作

    序论 我曾发表过文件输入输出的文章 xff0c 现在觉得有必要再写一点 文件 I O 在C 43 43 中比烤蛋糕简单多了 在这篇文章里 xff0c 我会详细解释ASCII和二进制文件的输入输出的每个细节 xff0c 值得注意的是 xff0
  • VC++鼠标画圈

    int r 61 100 int x0 61 gameRect left 43 pt x int y0 61 gameRect top 43 pt y int x y double n 61 0 MoveTo x0 y0 while n l
  • matlab练习程序(求向量间的旋转矩阵与四元数)

    问题是这样 xff0c 如果我们知道两个向量v1和v2 xff0c 计算从v1转到v2的旋转矩阵和四元数 xff0c 由于旋转矩阵和四元数可以互转 xff0c 所以我们先计算四元数 我们可以认为v1绕着向量u旋转 角度到v2 xff0c u
  • 用lighttpd搭建一个简易的http服务器

    1 安装lighttpd 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 cd wget http download lighttpd net lighttpd releases
  • 结构体(对齐规则及举例)

    概念 一种数据结构 xff1b C语言中聚合数据类型的一类 xff1b 可以被声明为变量 数组 指针等 xff0c 用以实现比较复杂的数据结构 xff1b 是一系列元素的集合 xff0c 这些元素被称为结构体成员 xff1b 结构体成员需要