解析C语言中位字段内存分配的问题

 更新时间:2013年05月15日 10:59:18   作者:  
本篇文章是对C语言中位字段内存分配的问题进行了详细的分析介绍,需要的朋友参考下

C语言的位字段是个比较有意思的特性。它的目的是在一个机器字中保存多个对象(每个对象占据若干bit),从而节省内存资源,同时又避免复杂的位运算。在此不再讨论位字段的具体语法,下面将研究位字段的存储特性。

先说含有多个字段(field)的字(word)所占空间的规律——含有多个字段的字的大小是所有字段的类型中的最长的那个的倍数。但要确定究竟是最长类型的几倍则比较复杂,这要看是否需要考虑类型对齐问题(即一个字段能否跨越两个最长类型)。

例1:

struct word {
char  field1 : 1;
char  field2 : 2;
int     field3 : 4;
};

前两个字段都是char类型,第三个是int类型,所有类型中最长的是int类型。所以字的大小是int类型长度(即4字节)的倍数。而size of word的结果是4字节(即int的1倍),这是因为word的三个字段总共7位(1+2+4),小于int的32位,且不需 考虑类型对齐问题。

例2:

struct word {
char  field1 : 1;
char  field2 : 2;
int     field3 : 30;
};

与上例一样, 所有 类型中最长的是 int类型。所以字的大小是int类型长度(即4字节)的倍数。而size of word的结果是8字节(即int的2倍),这是因为word的三个字段总共33位(1+2+30),需要两个int的64位才能装下, 且不需 考虑类型对齐问题。

例3:

struct word {
char  field1 : 3;
char  field2 : 6;
char  field3 : 3;
};

所有 类型中最长的是 char类型。所以字的大小是char类型长度(即1字节)的倍数。在linux下size of word的结果是3字节(即char的3倍)。如果只考虑word的三个字段总共12位(3+6+3),需要两个char的16位即能装下,但是在linux的gcc实现下,第二个字段不能跨越两个char(为了对齐),所以三个字段各占一个字节。共3字节。但 一个字段能否跨越两个最长类型是由具体的实现决定的。

其次,我们讨论word内各个field的存储,这个和具体的实现有关。有的是从左向右分配的,有的是从右向左分配的。这个没有规律可言。

最后,对word中的field不能进行取地址操作,这是因为指针需要对齐。但可以对word进行取地址操作。

相关文章

  • 利用C语言实现三子棋(井字棋)小游戏

    利用C语言实现三子棋(井字棋)小游戏

    这篇文章主要为大家详细介绍了利用C语言实现三子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C++ seekg函数用法案例详解

    C++ seekg函数用法案例详解

    这篇文章主要介绍了C++ seekg函数用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Qt 使用 canon edsdk 实现实时预览的示例代码

    Qt 使用 canon edsdk 实现实时预览的示例代码

    这篇文章主要介绍了Qt 使用 canon edsdk 实现实时预览的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C语言版的三子棋游戏

    C语言版的三子棋游戏

    这篇文章主要为大家详细介绍了C语言版的三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C语言的循环小练习详解

    C语言的循环小练习详解

    这篇文章主要为大家介绍了C语言的循环小练习,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C语言编程使用MATLAB绘制椭圆及圆角矩形

    C语言编程使用MATLAB绘制椭圆及圆角矩形

    这篇文章主要为大家介绍了C语言编程中使用MATLAB绘制椭圆及圆角矩形的实现源码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-02-02
  • C语言数据结构系列篇二叉树的概念及满二叉树与完全二叉树

    C语言数据结构系列篇二叉树的概念及满二叉树与完全二叉树

    在上一章中我们正式开启了对数据结构中树的讲解,介绍了树的基础。本章我们将学习二叉树的概念,介绍满二叉树和完全二叉树的定义,并对二叉树的基本性质进行一个简单的介绍。本章附带课后练习
    2022-02-02
  • C语言版三子棋小游戏

    C语言版三子棋小游戏

    这篇文章主要为大家详细介绍了C语言版三子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C++入门之实现十步万度游戏

    C++入门之实现十步万度游戏

    这篇文章主要介绍了C++入门实现十步万度游戏,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • 使用Qt框架制作一个表白程序

    使用Qt框架制作一个表白程序

    这篇文章主要为大家详细介绍了如何使用Qt框架制作一个表白程序,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-01-01

最新评论