位域和字节对齐

news2024/12/26 20:26:44

结构体中的位域

位域是一种特殊的结构体成员,它允许将一个字节或多个字节中的每个位作为一个独立的成员来使用。位域的语法形式为:

```

struct {
    type [member_name] : width;
};


```

其中,type 表示位域成员的类型,可以是 int、unsigned int、signed int 或者 char。member_name 表示位域成员的名称,可以省略。width 表示位域成员所占用的位数,可以是一个常量表达式或者是一个整数常量。

使用位域有以下几个特点:

- 位域成员的类型必须是 int、unsigned int、signed int 或者 char,不能是其他类型。
- 位域成员的宽度不能超过其类型的宽度,否则会被截断。
- 不同编译器对位域的实现方式可能不同,因此在使用位域时需要注意可移植性问题。
- 由于位域成员是按位存储的,因此访问位域成员的速度比访问普通成员要慢一些。

使用位域可以节省内存空间,但是需要注意对齐方式的问题。由于位域成员的宽度是固定的,因此在结构体中使用位域时需要考虑对齐方式,以避免出现填充字节,影响内存的使用效率。

基本数据类型长度

在大多数操作系统中,32 位系统和 64 位系统的基本数据类型的字节长度如下:

 

需要注意的是,不同的操作系统和编译器可能会有所不同,因此上述表格中的字节长度只是一般情况下的情况。此外,C++ 标准并没有规定基本数据类型的字节长度,只规定了它们的取值范围和精度。因此,如果需要在程序中使用特定字节长度的数据类型,最好使用 `<cstdint>` 头文件中定义的类型,例如 `int32_t`、`int64_t` 等等。

字节对齐

字节对齐是指在计算机内存中,为了提高数据访问效率而采取的一种内存对齐方式。在字节对齐的方式下,结构体或者数组中的每个元素都会被放置在内存地址的某个整数倍位置上,这个整数倍称为对齐系数或对齐粒度。这样可以确保每个元素的地址都是对齐的,避免了因为数据未对齐而导致的额外的内存访问开销,从而提高访问效率。

举个例子,假设有一个结构体定义如下:

```c++

struct Example {
    char a;
    int b;
    short c;
};


```

在大多数计算机系统中,int 类型的变量需要被放置在内存地址的 4 字节整数倍位置上,short 类型的变量需要被放置在内存地址的 2 字节整数倍位置上,char 类型的变量可以放在任意位置上。因此,对于上述结构体,在默认情况下,它的内存布局可能如下所示:

```

+---+---+---+---+---+---+---+---+
| a |   padding   | b |   c   |
+---+---+---+---+---+---+---+---+


```

其中,padding 表示填充字节,用于保证结构体中每个元素的地址都是对齐的。在这个例子中,由于 int 类型的变量需要 4 字节对齐,因此在 char 类型的变量后面,需要填充 3 个字节的 padding,才能让 int 类型的变量被放置在正确的位置上。同样,short 类型的变量也需要 2 字节对齐,因此在 int 类型的变量后面,需要填充 2 个字节的 padding,才能让 short 类型的变量被放置在正确的位置上。

需要注意的是,对于不同的编译器和操作系统,对齐系数可能会有所不同,因此在编写程序时,需要注意结构体和数组的字节对齐方式,以确保程序的正确性和效率。

字节对齐示例

#include<stdio.h>
typedef struct S1
{
 int i:8;
 char j:4;
 int a:4;
 double b;
}S1;
typedef struct S2
{
 int i:8;
 char j:4;
 double b;
 int a:4;
}S2;
typedef struct S3
{
 int i;
 char j;
 double b;
 int a;
}S3;
typedef struct Example 
{
    int a;
    char b;
    float c;
}Example;
int main()
{
 printf("%ld\n",sizeof(S1)); // 输出8
 printf("%ld\n",sizeof(S2)); // 输出12
 printf("%ld\n",sizeof(S3)); // 输出8
 printf("%ld\n",sizeof(Example)); // 输出8
 return 0;
}

结果

16
24
24
12

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/530655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络编程——TCP编程

TCP编程 流程服务器客户端 函数接口1、socket2、bind3、listen4、accept5、recv6、send7、connet 实现双工通信server.ccelient.c优化代码 流程 在C语言中进行TCP编程的一般步骤如下&#xff1a; &#xff08;1&#xff09;包含头文件&#xff1a; 在代码中包含必要的头文件&a…

面对象QgsPolygon

几何对象中的面用QgsPolygon进行封装&#xff0c;也称为多边形简单的多边形是由一串点连接而成&#xff0c;并首尾闭合多边形的结构更复杂&#xff0c;除了有一个外部轮廓&#xff0c;还可能包括内部多个轮廓 创建面对象 QgsPolygon() #创建一个空的面 使用setExteriorRing设…

Spring AOP 实践指南

Spring AOP 实践指南 文章目录 Spring AOP 实践指南一、概述1、简介2、官方资料3、本文档说明 二、基本使用1、引入依赖2、定义切面3、定义切点4、创建 HelloController5、启动项目&#xff0c;访问测试 三、通知1、概述五种通知通知的顺序 2、通知方法接受的参数3、前置通知代…

Thread线程学习(1) 了解线程的基本知识——什么是线程

本专栏将记录有关线程方面的知识 在计算机科学领域中&#xff0c;线程&#xff08;Thread&#xff09;是一种执行计算机程序的基本单元。对于初学者来说&#xff0c;理解线程是学习并发编程的关键一步。本文将带你了解线程的基础知识&#xff0c;包括线程的定义、线程与进程的关…

GPT神奇应用:给孩子做每日安排

正文共 1163 字&#xff0c;阅读大约需要 4 分钟 家长必备技巧&#xff0c;您将在4分钟后获得以下超能力&#xff1a; 快速生成每日安排计划 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片…

JavaScript实现打印倒金字塔的代码

以下为实现打印倒金字塔的程序代码和运行截图 目录 前言 一、实现打印倒金字塔 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本博文代码可以根据题目要求实现相关使用功…

动态规划专题

动态规划专题 最长递增子序列LeetCode 300. 最长递增子序列解题思路代码实现 LeetCode 354. 俄罗斯套娃信封问题解题思路代码实现 总结 不要纠结&#xff0c;干就完事了&#xff0c;熟练度很重要&#xff01;&#xff01;&#xff01;多练习&#xff0c;多总结&#xff01;&…

【Redis】Redis中bitmap的原理和使用

文章目录 一、原理二、BitMap 相关命令三、BitMap 空间计算四、使用场景1. 用户签到2. 统计活跃用户&#xff08;用户登陆情况&#xff09;3. 统计用户在线状态4. 实现布隆过滤器 五、总结 一、原理 先声明一下&#xff1a;Redis 有5种数据类型&#xff0c;而 BitMap 在 Redis…

【k8s】Ubuntu22.04离线部署k8s集群:搭建软件仓库和镜像仓库(repo节点)

上两篇主要记录了在CentOS 7环境中离线部署k8s的方案&#xff0c;本篇继续介绍方案二在Ubuntu 22.04的实现。&#xff08;当然&#xff0c;整体思路还是跟上篇基本相似&#xff09; 目录 Ubuntu22.04离线部署k8s集群&#xff1a;搭建软件仓库和镜像仓库&#xff08;repo节点&am…

总结852

学习目标&#xff1a; 月目标&#xff1a;5月&#xff08;张宇强化前10讲&#xff0c;背诵15篇短文&#xff0c;熟词僻义300词基础词&#xff09; 周目标&#xff1a;张宇强化前5讲并完成相应的习题并记录&#xff0c;英语背3篇文章并回诵 每日必复习&#xff08;5分钟&#…

云上高校导航 小程序 开发教程 1.0.1

​ Gitee仓库&#xff1a;云上高校导航 GitHub仓库&#xff1a;云上高校导航 “云上高校导航”是一套基于小程序云开发的校园导航类系统开发方案&#xff0c;该开发方案可供开发者进行二次开发&#xff0c;用于解决师生和访客的校园出行需求。 项目优势及创新&#xff1a;…

ChatGPT vs. Bing vs. Bard

随着 2022 年 ChatGTP 的推出&#xff0c;人工智能聊天机器人的世界突然走上了一条新道路。如今&#xff0c;密切关注 AI 的人都知道&#xff0c;不同公司推出了几款产品。从谷歌拥有自己的 Bard AI&#xff0c;到微软发布新的 Bing AI Chat&#xff0c;再到 OpenAI 发布GPT-4。…

云服务器搭建Python项目实现学术优化chatgpt

云服务器搭建实现学术优化chatgpt 1 服务器准备2 云服务器配置2.1 python虚拟环境2.1.1 python3.9安装配置2.1.2 下载python项目2.1.3 创建python虚拟环境 3 后台运行python项目&#xff08;不然不能关闭与云服务器的连接&#xff0c;那意义何在&#xff1f;&#xff09; 1 服务…

GEE:将年度NDVI时间序列影像集合(Image Collection)转变为多波段影像,并下载

作者:CSDN @ _养乐多_ 本文将重点介绍如何使用 Google Earth Engine (GEE) 将多波段影像堆叠并导出,并探讨其应用场景和好处。 通过使用 GEE 的多波段影像堆叠功能,我们可以将不同波段的遥感影像整合成一个多波段影像,以支持各种地理空间分析任务。这种方法适用于遥感影…

以太网端口类型

以太网端口有 3种链路类型:access、trunk、hybird Access类型端口只能属于1个VLAN 般用于连接计算机 端口&#xff1b;Trunk类型端口可以允许多个VLAN通过,可以接收和发送多个VLAN 报文,一般用于交换机之间的连接&#xff1b;Hybrid类型端口可以允许多个VLAN通过&#xff0c;可…

Dubbo的使用

Dubbo在开发中&#xff0c;存在两种开发思路。基于SOA(面向服务的体系架构)思想和辅助SpringCloud架构提升效率。 Dubbo 默认使用 Netty 框架 Dubbo基于SOA思想 正常SpringBoot项目是只有一个启动类&#xff0c;接口定义在web层(即Controller层)中,然后调用Service层。&…

Matlab 梯度下降法

一、简介 梯度下降法&#xff08;Gradient descent&#xff09;或最速下降法&#xff08;steepest descent&#xff09;是求解无约束最优化问题的一种常用方法。 假设fx)在R上具有一阶连续偏导数的函数。要求解的无约束最优化问题是。其本质是一个迭代的方法&#xff0c;选择…

VMware Workstation 网络备忘 + 集群规模

概述 在虚拟机中部署服务&#xff0c;进行IP规划&#xff0c;进行相关的前期准备 3 张网卡 2个不同的网段 1个NAT 概述截图 NAT 截图 VMnet0 截图 VMnet1 截图 总结&#xff1a; 网卡&#xff08;网络适配器&#xff09;名称IP网段备注NATens33192.168.139.0VMnet0ens34VMne…

手把手教你在RT-THREAD bsp上运行pikascript脚本点亮小灯

简介 这篇文章介绍如何在RT-THREAD bsp上运行pikascript脚本。 pikascript相当于一个小型的micropython。 最近有一些结构上的调整&#xff0c;写这篇文章大概介绍一下如何使用&#xff0c;以及开发过程中需要注意的问题。 这篇文章几乎适配所有的RT-THREAD上的bsp。&#xff…

在Kubernetes(K8S) 上运行第一个应用

1、启动代理 &#xff1a; kubectl proxy 2、部署应用程序最简单的方式是使用 kubectl run 命令&#xff0c;该命令可以创建所有必要的组件而无需JSON或YAML文件。 --imageluksa/kubia 显示的是指定要运行的容器镜像&#xff0c;--port8080 选项告诉Kubernetes应用正在监听808…