位域和字节对齐

这篇具有很好参考价值的文章主要介绍了位域和字节对齐。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

结构体中的位域

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

```

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文章来源地址https://www.toymoban.com/news/detail-446284.html

到了这里,关于位域和字节对齐的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 字节面试:领域、子域、核心域、通用域和支撑域怎么划分?

    领域驱动设计(DDD)里面有一堆专业术语,比如领域、子域、核心域、通用域、支撑域等等,听着是不是觉得挺吓人?别怕,我来带你轻松搞懂它们。 领域是指一定的业务范围或问题域。在解决业务问题时,DDD 会将业务领域进行细分,将问题范围限定在一定的边界内,在这

    2024年04月15日
    浏览(26)
  • 深入了解C语言中的结构体类型与内存对齐

    在C语言中,结构体是一种 自定义的数据类型 , 它允许我们将不同类型的数据组合在一起,形成一个新的数据类型 。结构体的使用为我们解决了一些复杂数据的表示和处理问题,不仅限于单单的整型或者字符。本文将深入探讨结构体类型、结构体变量的创建和初始化,并详

    2024年04月11日
    浏览(32)
  • 结构体对齐原理及在STM32中的设计原则和实现

    在嵌入式系统开发中,结构体作为一种常见的数据组织方式,在内存中的布局方式对于程序性能和内存占用具有重要影响。本文将深入探讨单片机C语言中的结构体对齐原理、重要性以及不同的对齐方式,并通过示例演示结构体对齐如何影响内存占用、访问性能以及传输与存储

    2024年02月10日
    浏览(26)
  • 2022-03-31 Amr-nb格式字节对齐、非字节对齐的转换和解码处理(含源码)

    AMR的格式分为AMR-NB、AMR-WB、AMR-WB+ 三种格式的区分和差异可以自行百度,在这里就不做细分了。 我相信,找到这篇文章的基本已经是入门了。 这一次我们主要处理的是AMR-NB格式的数据。本文主要贴出了如何区分字节对齐、非字节对齐的方法,以及如何处理解码?( 需要完整

    2024年02月02日
    浏览(26)
  • C语言----字节对齐

            针对字节对齐,百度百科的解释如下:         字节对齐是字节按照一定规则在空间上排列,字节(Byte)是计算机信息技术用于计量存储容量和传输容量的一种计量单位,一个字节等于8位二进制数,在UTF-8编码中,一个英文字符等于一个字节,字节按照一定规则在

    2024年02月13日
    浏览(32)
  • c/c++--字节对齐(byte alignment)

    在所有结构体成员的字节长度都 没有超出操作系统基本字节单位 (32位操作系统是4,64位操作系统是8)的情况下 按照结构体中字节最大的变量长度来对齐; 若结构体中某个变量字节 超出操作系统基本字节单位 那么就按照 系统字节单位来对齐 。 注意: 并不是32位就直接按照

    2024年02月07日
    浏览(27)
  • 为什么要做字节对齐 alignment?

    下面这段 C++ 代码的输出是什么?定义的 Type 占用的字节数(下面简称为字节数)是多少呢? 经过编译运行,在 x86-64 Linux 机器上输出的结果是 8 。如果将成员变量的字节数相加求和,等于 1 + 4 = 5 字节。那多出来的 3 字节做什么了? 一般,我们会把多出的 3 字节用来做字节

    2024年02月07日
    浏览(31)
  • STM32 大小端与字节对齐使用记录

    串口数据包解析 接收到的数据包: 其中数据内容为: 我们设计的结构体 使用内容复制函数 想要的数据: 实际的数据: 解决方法: CMSIS都已经给你写好的,请看core_cm3.h 执行完这个代码后 我们希望 实际上 解决方法:

    2024年02月07日
    浏览(27)
  • C/C++编译器的字节对齐方式

    C/C++编译器的缺省字节对齐方式为自然对界。即在缺省情况下,编译器为每一个变量或是数据单元按其自然对界条件分配空间。 在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储(成员之间可能有插

    2024年01月19日
    浏览(22)
  • 探索Redis特殊数据结构:Bitmaps(位图)在实际中的应用

    Redis官方提供了多种数据类型,除了常见的String、Hash、List、Set、zSet之外,还包括Stream、Geospatial、Bitmaps、Bitfields、Probabilistic(HyperLogLog、Bloom filter、Cuckoo filter、t-digest、Top-K、Count-min sketch、Configuration)和Time series。这些数据类型在Redis的数据结构中发挥着各自独特的作用。

    2024年01月19日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包