结构体对齐的步骤:

1、结构体各成员对齐

2、整个结构体圆整

结构体对齐的特定对齐值:

1、自身对齐值: 自身对齐值就是结构体变量里每个成员的自身大小;

2、指定对齐值: 指定对齐值是由宏#pragma pack (N)指定的值,里面的N必须是2的幂次方,如1,2,4,8,16等。如果没有通过#pragma pack宏那么在32位的Linux主机上默认指定对齐值为4,64位的Linux主机上默认指定对齐值为8,ARM CPU默认指定对齐值为8;

3、有效对齐值: ① 结构体成员自身对齐时有效对齐值为自身对齐值与指定对齐值中较小的一个,

② 结构体圆整时,为所有成员中自身对齐值最大的与指定对齐值较小的一个;

下面举两个简单的例子(32位系统):

typedef struct _st_struct1typedef struct _st_struct2

{{

char a;short b;

short b;int c;

int c;char a;

}st_struct1;}st_struct2;

这两个结构体内部的数据类型是相同的,那是不是也意味着这两个结构体所占用的存储空间也是相同的呢?答案是不同的。

我们先运用上面讲解的流程来对这两个结构体分别进行对齐。首先将确定自身对齐值以及指定对齐值:

自身对齐值:char  1byte、short   2bytes、int  4bytes

指定对齐值:4bytes(指定为32位系统)

下面对结构体st_struct1进行对齐:

下面对结构体st_struct2进行对齐:

可见虽然含有的数据类型相同,但是结构体st_struct1和结构体st_struct2所占用的存储空间却不同。

以上就是结构体对齐的简单举例。

另外需要注意的是,Windows操作系统与Linux操作系统关于结构体对齐会有一点差别,Windows操作系统中在结构体对齐的第二步也就是整个结构体圆整时,所用的是成员自身对齐值中最大的那一个。这个小的差别是在牛客网上做笔试题时发现的。

//32位机器上定义如下结构体:

struct xx

{

long long _x1;

char _x2;

int _x3;

char _x4[2];

static int _x5;

//注:_x5为静态变量,程序未编译时就存在,其存储在代码数据段中的bss区中

};

int xx::_x5;

//请问sizeof(xx)的大小是()

A、19B、20C、15D、24

按照前面所讲的,并且在Linux下编译通过后,得到的结果是20(4字节对齐)。同样也在Windows下编译通过后,得到的结果是24(8字节对齐)。

linux windows 结构体,Linux下C语言——结构体对齐相关推荐

  1. Linux/Windows/MacOS各个操作系统下推荐应用集合

    Linux/Windows/MacOS各个操作系统下推荐应用集合 作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上搜集各种软件的蒟蒻- 作为一 ...

  2. Linux / Windows Subsystem for Linux (WSL) 安装 ADB (Android Debug Bridge,Android 调试桥)

    Linux / Windows Subsystem for Linux (WSL) 安装 ADB (Android Debug Bridge,Android 调试桥) Android 开发者网站 ht ...

  3. c语言结构体和联合体,C语言结构体和联合体

    1.单链表插入 #include #include #define FALSE 0 #define TRUE 1 typedef struct NODE{ STRUCT NODE *link; int ...

  4. C++工作笔记-结构体与类的进一步探究(在C++中的结构体,非C语言结构体)

    今天把Qt Creator中的项目放到VS上,使用MSVC编译器发现跑不动链接错误,报的是如下的这个错误: 我在Qt上用MinGW明明不会报错,而他却说链接不到,日了个狗. 后面根据报错提示,我把如下 ...

  5. windows10 安装linux,windows 10安装linux(ubuntu)子系统

    windows10安装ubuntu子系统系统 之前一直在虚拟机中使用linux系统,但是不是很方便,后来发现windows下也有了linux系统.感觉还不错 1. 打开windows应用市场micro ...

  6. Linux -- Windows右键开启Linux子系统Bash

    好容易安装完 linux 子系统,发现对于一些必须在 linux 下使用的软件或者其他的东东的使用实在是方便了不少,即少了运行虚拟机的卡慢内存占比高,也少了 linux/windows 双系统的切换, ...

  7. c语言结构体定义坐标,C语言结构体定义的方法汇总

    什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...

  8. c语言结构体反射解析,C语言结构体解析

    我们知道定义一个数组就等于定义了多个相同类型的变量,它们的类型是一样的.有时有这样的需求,如果我想保存一些信息,但每个信息类型不一定相同,这时该怎么办?我们就可以自己定义一类型,而这个类型,就是结构体 ...

  9. C 语言结构体引用,引用 C 语言结构体学习

    引用 C 语言结构体学习 这篇文章很基础,是个学习的好资料,所以收藏了: 1.直接声明结构体变量: struct{ int length; int width; }box1; 这样就声明了一个名为bo ...

最新文章

  1. 31个Python实战项目带你学会图像处理
  2. Go 语言编程 — validator 数据校验工具
  3. 北京python培训班价格-北京Python培训班,为什么Python超适合小白学习
  4. 数据库视图的概念和相关操作合集
  5. DNS域名解析服务配置会不会?
  6. 『Linux基础 - 4 』linux常用命令(1)
  7. 线性代数相关知识点回顾
  8. CRM How to configure text type to allow html editor
  9. C#中容器控件GroupBox、Panel、TabControl
  10. SpringXML方式配置bean的懒加载lazy-init
  11. Spring构造函数依赖注入示例
  12. 阿里云与SUSE共同畅聊云原生
  13. HFSS脚本建模入门
  14. 王刚日记:写文章和赚钱之间的关系
  15. java 纯真地址库_JAVA解析纯真IP地址库
  16. Jest测试框架入门之快照测试(附踩坑指南)
  17. 电脑硬盘锁怎么解除linux,硬盘锁了怎么办_硬盘锁怎么解除
  18. 从数据孪生发展到元宇宙
  19. 配置secureCRT
  20. HDU3687 National Day Parade

热门文章

  1. pb 如何判断数据窗口中是否有某个字段_怎么判断数据窗口中某个字段存在重复的数据...
  2. mac php fpm 自动启动,mac系统,php-fpm加入开机启动项
  3. ueditor 上传路径 Php_v9切换ueditor后图片上传路径问题 改成绝对路径
  4. 【iOS开发必备指南合集二】申请IDP/真机调试/GameCenter 指南/OpenFeint指南
  5. 一次多线程臭虫经验——异步日志c++化时
  6. PHP5.4 Apache Mysql搭配与多站点配置
  7. 无锡东亭计算机培训班,锡山区东亭办公自动化培训、电脑培训班有哪些?
  8. nvidia命令不可用linux,linux – 如何从命令行获取nvidia驱动程序版本?
  9. python统计数据分析基础教程_Python数据分析基础教程:NumPy学习指南(第2版)
  10. 万能电子狗升级工具_HUD抬头显示,车萝卜再推新品,屏幕全新升级