代码如下:

// 临界区.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <windows.h>int _tmain(int argc, _TCHAR* argv[])
{struct bs{unsigned a : 1;unsigned b : 3;unsigned c : 32;}bit,*pbit;bit.a = 1;bit.b = 7;bit.c = 15;//printf("%d,%d,%d", bit.a, bit.b, bit.c);pbit = &bit;pbit->a = 0;pbit->b &= 3;pbit->c |= 1;printf("%d,%d,%d", pbit->a, pbit->b, pbit->c);getchar();return 0;
}

  位域主要的位数的定义,最大可到255,定义到32位。

看看反汇编就都明白了。

00053CA0 55                   push        ebp
00053CA1 8B EC                mov         ebp,esp
00053CA3 81 EC E0 00 00 00    sub         esp,0E0h
00053CA9 53                   push        ebx
00053CAA 56                   push        esi
00053CAB 57                   push        edi
00053CAC 8D BD 20 FF FF FF    lea         edi,[ebp-0E0h]
00053CB2 B9 38 00 00 00       mov         ecx,38h
00053CB7 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
00053CBC F3 AB                rep stos    dword ptr es:[edi]
00053CBE A1 24 80 05 00       mov         eax,dword ptr ds:[00058024h]
00053CC3 33 C5                xor         eax,ebp
00053CC5 89 45 FC             mov         dword ptr [ebp-4],eax  9:     struct bs10:    {11:        unsigned a : 1;12:      unsigned b : 3;13:      unsigned c : 32;14:     }bit,*pbit;15:  bit.a = 1;
00053CC8 8B 45 F0             mov         eax,dword ptr [bit]
00053CCB 83 C8 01             or          eax,1
00053CCE 89 45 F0             mov         dword ptr [bit],eax  16:  bit.b = 7;
00053CD1 8B 45 F0             mov         eax,dword ptr [bit]
00053CD4 83 C8 0E             or          eax,0Eh
00053CD7 89 45 F0             mov         dword ptr [bit],eax  17:  bit.c = 15;
00053CDA 8B 45 F4             mov         eax,dword ptr [ebp-0Ch]
00053CDD 83 E0 00             and         eax,0
00053CE0 83 C8 0F             or          eax,0Fh
00053CE3 89 45 F4             mov         dword ptr [ebp-0Ch],eax  18:  //printf("%d,%d,%d", bit.a, bit.b, bit.c);19:     pbit = &bit;
00053CE6 8D 45 F0             lea         eax,[bit]
00053CE9 89 45 E4             mov         dword ptr [pbit],eax  20:     pbit->a = 0;
00053CEC 8B 45 E4             mov         eax,dword ptr [pbit]
00053CEF 8B 08                mov         ecx,dword ptr [eax]
00053CF1 83 E1 FE             and         ecx,0FFFFFFFEh
00053CF4 8B 55 E4             mov         edx,dword ptr [pbit]
00053CF7 89 0A                mov         dword ptr [edx],ecx  21:  pbit->b &= 3;
00053CF9 8B 45 E4             mov         eax,dword ptr [pbit]
00053CFC 8B 08                mov         ecx,dword ptr [eax]
00053CFE D1 E9                shr         ecx,1
00053D00 83 E1 07             and         ecx,7
00053D03 83 E1 03             and         ecx,3
00053D06 83 E1 07             and         ecx,7
00053D09 D1 E1                shl         ecx,1
00053D0B 8B 55 E4             mov         edx,dword ptr [pbit]
00053D0E 8B 02                mov         eax,dword ptr [edx]
00053D10 83 E0 F1             and         eax,0FFFFFFF1h
00053D13 0B C1                or          eax,ecx
00053D15 8B 4D E4             mov         ecx,dword ptr [pbit]
00053D18 89 01                mov         dword ptr [ecx],eax  22:  pbit->c |= 1;
00053D1A 8B 45 E4             mov         eax,dword ptr [pbit]
00053D1D 8B 48 04             mov         ecx,dword ptr [eax+4]
00053D20 83 C9 01             or          ecx,1
00053D23 8B 55 E4             mov         edx,dword ptr [pbit]
00053D26 8B 42 04             mov         eax,dword ptr [edx+4]
00053D29 83 E0 00             and         eax,0
00053D2C 0B C1                or          eax,ecx
00053D2E 8B 4D E4             mov         ecx,dword ptr [pbit]
00053D31 89 41 04             mov         dword ptr [ecx+4],eax  23:   printf("%d,%d,%d", pbit->a, pbit->b, pbit->c);
00053D34 8B 45 E4             mov         eax,dword ptr [pbit]
00053D37 8B 48 04             mov         ecx,dword ptr [eax+4]
00053D3A 8B F4                mov         esi,esp
00053D3C 51                   push        ecx
00053D3D 8B 55 E4             mov         edx,dword ptr [pbit]
00053D40 8B 02                mov         eax,dword ptr [edx]
00053D42 D1 E8                shr         eax,1
00053D44 83 E0 07             and         eax,7
00053D47 50                   push        eax
00053D48 8B 4D E4             mov         ecx,dword ptr [pbit]
00053D4B 8B 11                mov         edx,dword ptr [ecx]
00053D4D 83 E2 01             and         edx,1
00053D50 52                   push        edx
00053D51 68 C0 58 05 00       push        558C0h
00053D56 FF 15 24 91 05 00    call        dword ptr ds:[59124h]
00053D5C 83 C4 10             add         esp,10h
00053D5F 3B F4                cmp         esi,esp
00053D61 E8 DA D3 FF FF       call        __RTC_CheckEsp (051140h)

  在反汇编中我们可以看到当申明struct结构体的时候里面的所有变量操作并不占用空间。

当对结构体成员等变量操作的时候才进行占用空间。

同时所有定义的十进制在结构体中都会转换成二进制进行位域比较。

转载于:https://www.cnblogs.com/blck/p/8472514.html

【记录】C++中的位域相关推荐

  1. 位域 内存 字节序_C语言中的位域、字节序、比特序、大小端(转)

    1.比特序 / 位序 / bit numbering / 我们知道一个字节有8位,也就是8个比特位.从第0位到第7位共8位.比特序就是用来描述比特位在字节中的存放顺序的.通过阅读网页的内容,关于比特序 ...

  2. NET问答: 如何记录 EntityFramework 中的所有 SQL 日志 ?

    咨询区 PC.: 我正在 MVC5 项目中使用 EF 6.0,为了方便调试和获取性能指标,我想记录 EF6 中的所有 sql  日志. 在 Java/Hibernate 中,我只需要设置 hibern ...

  3. C#开发笔记,点点细微,处处真情,记录开发中的痛点

    该文章的最新版本已迁移至个人博客[比特飞],单击链接 C#开发笔记,点点细微,处处真情,记录开发中的痛点 | .Net中文网 访问. 概述 本系列文章将会向大家介绍本人实际开发过程中所遇到技术点和心得 ...

  4. C中的位域与大小端问题

    C中的位域与大小端问题 字节内也是有大小端问题,与字节中的大小端类似: 1)little endian中的位应该这样排列:  01234567  即排在前面的是低位.因此,先分配least signi ...

  5. java 记录考勤记录_Java中的记录器– Java记录示例

    java 记录考勤记录 Today we will look into Logger in Java. Java Logger provides logging in java programming ...

  6. 搭建一个专属于两个人的爱情网站,记录生活中的点点滴滴

    搭建一个专属于两个人的爱情网站,记录生活中的点点滴滴 爱情是世界上最为令人着迷的情感,它可以让两个原本毫无关系的人变成最密不可分的伴侣.它可以是山盟海誓也可以是柴米油盐,有些人恋爱喜欢拍照,吃了什么, ...

  7. 实际记录vue3中使用rrweb以及rrweb-player组件实现网页录屏和回放功能,还有遇到的问题和解决思考

    文章目录 前言 一.rrweb与rrweb-player引入项目中 二.使用步骤 1.引入代码 2.html部分代码 3.script部分代码 三. 遇到的3个问题总结,全部都是找了很久解决办法没找到 ...

  8. 如何用日志记录VSS中的用户修改行为

    如何用日志记录VSS中的用户修改行为 可看到所人的进出VSS的的记录(check in/add/delete等), 方法如下: 1. 在共享数据库.含有 ini 文件的目录下创建一个文本文件(切记), ...

  9. python困境_Python笔记-囚徒困境及记录困境中的选择

    [功能] 学习的代码:囚徒困境练习题( python 3.7版本下调试成功) [问题一] 1.若两人都认罪,则两人各判10年: 2.若一个认罪一个抵赖,则认罪的人判1年,抵赖的人判20年: 3.若两人 ...

  10. android iphone 记事本,iPhone上有哪些记事本软件足够你记录生活中的细节?

    iPhone上有哪些记事本软件足够你记录生活中的细节?一款好用的记事本软件应具备启动快.快速添加笔记.运行流畅等元素,所以笔者搜罗了一些优秀的记事本APP,不仅可能实现这些基本要求,还有诸如云同步.跨 ...

最新文章

  1. hibernate的异常 Session was already closed
  2. commons-lang3:DateUtils
  3. idea mac 查找文件快捷键_idea for mac 最全快捷键整理
  4. 关于Promise详解
  5. 新泰一中2021年高考成绩查询,牛!泰安新泰一中2018年高考一班级62人全部上本科线...
  6. python编程新手常犯的错误_初学者开发人员都会犯的7个Python错误
  7. mybatis 主从表关联查询封装返回结果
  8. c++字节对齐编译器指令#pragma
  9. 英语听力采用计算机化考试,今年的北京普通高考英语听力有何不同?
  10. 同济大学高等数学下册第八章向量代数与空间解析几何以及每日一题
  11. 晶晨线刷工具_Amlogic_USB_Burning_Tool _刷机工具分享
  12. Windows实例通过IIS如何搭建多个FTP站点
  13. 数字信号和模拟信号区别
  14. MTK平台TP驱动详解
  15. 全员营销实施困难,是因为你没有这个神器
  16. 蓝牙键盘 android手机游戏,使用BluetoothHidDevice将安卓手机同时模拟成鼠标和键盘...
  17. 【解决方案】Gitlab阿里企业邮箱配置
  18. 基于Ubuntu9.10 雨林木风Linux Y1.5发布
  19. (一)安全测试基础:安全测试的内容
  20. 「设计模式(六) - Builder模式」

热门文章

  1. 页表长度和页表大小_linux内核页表映射机制:线性地址如何转为物理地址?
  2. 诺基亚7 android 9,诺基亚7 Plus正式推送安卓9.0系统!
  3. CS224N刷题——Assignment3.1_A window into NER
  4. Linq To EF (添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题)...
  5. GO随笔-Web简读
  6. MyBatis_Study_003(字段名与属性名称不一致,resultMap)
  7. 第十篇:复制对象时切记复制每一个成分
  8. Spring ioc,aop的理解
  9. 前端性能优化(十一)
  10. mongodb的学习过程