关于位域如何节省内存(C++)

位域:  最先使用在c语言中后来C++继承了这一优良的特点。

举个栗子:     int  -->  4字节   2^32位 ,如果我们只需要其表达一个0~16的数字,

使用一个int就显得稍稍有些许浪费,所以我们这里就可以使用到位域0~16  --> 2^1 ~ 2^5

我们就可以这样来声明了:      int   sudo: 5; 就可以了!

 1 /*
 2    设计一个结构体存储学生的成绩信息,
 3    需要包括学号,年纪和成绩3项内容,学号的范围是0~99 999 999,
 4    年纪分为freshman,sophomore,junior,senior四种,
 5    成绩包括A,B,C,D四个等级。
 6    请使用位域来解决:
 7 */
 8 #include<iostream>
 9
10 using namespace std;
11
12   enum Age{ freshman , sophomore , junior ,senior } ;
13
14   enum grade{ A , B , C , D };
15
16   class student {
17    private :
18      unsigned int num :27;
19      Age age : 2 ;
20      grade gra:2 ;
21    public  :
22        /* 析构函数 */
23        ~ student(){
24           cout<<"student has been xigou l ! ";
25        }
26        /* 构造函数 */
27        student(unsigned int num , Age age , grade gra );
28       void show();
29   }  ;
30
31    student::student(unsigned int num , Age age , grade gra ):num(num),age(age),gra(gra){
32    };
33
34    inline void  student::show(){
35
36       cout<<"学号为:"<<this->num<<endl;
37       string sag;
38       //采用枚举
39       switch(age){
40           case  freshman :  sag = "freshman" ; break ;
41           case  junior  :   sag = "junior" ; break ;
42           case  senior :    sag = "senior" ; break ;
43           case  sophomore :  sag = "sophomore" ; break ;
44       }
45       cout<<"年纪为:"<<sag<<ends;
46       cout<<"成绩为:"<<char(‘A‘+gra)<<endl;
47    }
48
49  int main(int args [] ,char argv[]){
50
51       student stu(12345678,sophomore,C) ;
52       stu.show();
53       cout<<sizeof stu<<endl;
54     return 0;
55  }

 1 /*
 2    编写一个名为CPU的类,描述一个CPU的以下信息:
 3    时钟频率,最大不会超过3000MHZ = 3000*10^6 ;字长,可以
 4    是32位或64位;核数,可以是单核,双核,或四核,是否
 5    支持超线程。各项信息要求使用位域来表示。通过输出sizeof
 6    (CPU)来观察该类所占的字节数。
 7 */
 8  #include<iostream>
 9  #include<string>
10  using namespace std;
11   //字长
12   enum word{ a, b };
13   //核数
14   enum keshu{one ,two ,four };
15   //是否支持超线程
16   enum  es_no{yes ,no} ;
17
18  class intel_CPU{
19    private :
20     // 2^29 = 536 870 912
21    unsigned int tp : 29 ;
22      word  wd : 1  ;
23      keshu ks : 2 ;
24      es_no en : 1 ;
25    public :
26     //构造函数
27      intel_CPU(int tp=0,word wd=a,keshu ks=two,es_no en=no):
28          tp(tp),wd(wd),ks(ks),en(en){
29           cout<<"this is a construct !"<<endl;
30      };
31      //析构函数
32      ~intel_CPU();
33       void show();
34
35  };
36     intel_CPU::~intel_CPU(){
37
38       cout<<"this is a 析构函数!!"<<endl;
39     }
40
41   void inline intel_CPU::show() {
42
43       cout<<"时钟频率为:"<<ends;
44       cout<<tp<<endl;
45       cout<<"字长为【32 or 64】: ";
46       if(wd==a)cout<<32<<endl;
47       else cout<<64<<endl;
48       switch (ks){
49         case one :  cout<<"单核"<<endl; break;
50         case two :  cout<<"双核"<<endl; break;
51         case four:  cout<< "四核”"<<endl; break;
52         default :   cout<<"山寨机,没核" ; break;
53      }
54      cout<<"是否支持超线程模式:"<< (en==yes?"支持":"不支持")<<endl;
55   }
56
57  int main(){
58
59      intel_CPU  icp(123456789);
60      icp.show();
61      cout<<sizeof icp<<endl;
62
63  }
时间: 2024-11-29 02:37:16

关于位域如何节省内存(C++)的相关文章

python __slots__ 使你的代码更加节省内存

在默认情况下,Python的新类和旧类的实例都有一个字典来存储属性值.这对于那些没有实例属性的对象来说太浪费空间了,当需要创建大量实例的时候,这个问题变得尤为突出. 因此这种默认的做法可以通过在新式类中定义了一个__slots__属性从而得到了解决.__slots__声明中包含若干实例变量,并为每个实例预留恰好足够的空间来保存每个变量,因此没有为每个实例都创建一个字典,从而节省空间. 现在来说说python中dict为什么比list浪费内存? 和list相比,dict 查找和插入的速度极快,不会

节省内存的嵌入式软件设计技巧

现在新买的安卓千元机都是2G内存的了,我们还要绞尽脑汁地省内存?是的,那是高端处理器的特色,咱们这里讲的是资源紧缺型的嵌入式系统设计方法.一般主控是单片机控制器的电子产品的成本跟内存的关系可是成正比的,尤其在SOC芯片设计时是固件开发需要重点关注的.大量量产前要确定内置SRAM的大小,而且是在满足功能需求的情况下越小越好.这就需要考究软件系统的设计和编程开发的技能了.这里仅就我个人的工作经验来总结,涉及的是音视频多媒体电子产品,类似系统一般都会自行定制操作系统,驱动.中间件和应用等模块都有,所谓

【原创】一个支持极限大小的数组MaxArray,且节省内存

大家好,我写了一个支持极限大小的数组MaxArray,很有用的,希望大家喜欢~~ 问:.net类库不是自带了一个吗,干嘛还要自己写一个?好在哪里? 答:数组可以在创建后立即访问范围内的任意索引位置,而不需要依次添加,可以跳跃添加,但它的缺点就是创建时立即分配全部内存,比如你连续新建几个int[] arr=new int[int.maxvalue]这样的极限大的数组,会遇到内存溢出异常. 问:要节省内存,可以用ArrayList或List<T>这些,干嘛非得自己写一个? 答:arraylist或

定义在构造函数内部的方法,会在它的每一个实例上都克隆这个方法;定义在构造函数的prototype属性上的方法会让它的所有示例都共享这个方法,但是不会在每个实例的内部重新定义这个方法. 如果我们的应用需要创建很多新的对象,并且这些对象还有许多的方法,为了节省内存,我们建议把这些方法都定义在构造函数的prototype属性上。

定义在构造函数内部的方法,会在它的每一个实例上都克隆这个方法;定义在构造函数的prototype属性上的方法会让它的所有示例都共享这个方法,但是不会在每个实例的内部重新定义这个方法. 如果我们的应用需要创建很多新的对象,并且这些对象还有许多的方法,为了节省内存,我们建议把这些方法都定义在构造函数的prototype属性上.当然,在某些情况下,我们需要将某些方法定义在构造函数中,这种情况一般是因为我们需要访问构造函数内部的私有变量.

让暂时不用的chrome标签页休眠节省内存的插件

使用 Chrome 浏览器时开多个标签时,这时候就会感觉到电脑卡,因为chrome浏览器本身很占内存,开多个网页时更占内存.The Great Suspender 这个 Chrome 扩展可以让你把不需要的标签进入睡眠模式以节省内存,保证流畅的浏览体验.The Great Suspender 支持20秒自动休眠,非常好用. 原文地址:https://www.cnblogs.com/greatfish/p/8656276.html

多级页表如何节省内存

在谈到多级页表的优势的时候,很多地方都是这么说的:32位地址空间的分页系统,如果页面大小为4KB,则每个进程可达1M个页,假设每个页表项占用4个字节,这样每个进程仅仅页表项就占用了4MB连续的内存空间. 那么多级页表怎么节省存储空间的? 如果是2级页表,32位地址分为10,,10,12这3部分.则,页目录表1024项,每个小页表也是1024项,实际的存储空间是1024*4k(所有小页表大小)+4k(页目录大小),变大了!!!!!! 在这里我谈谈个人的理解! 实际上,一个进程并不是所有线性地址都会

python基础===创建大量对象是节省内存方法

问题: 你的程序要创建大量(可能上百万) 的对象,导致占用很大的内存. 解决方案: 对于主要是用来当成简单的数据结构的类而言,你可以通过给类添加__slots__属性来极大的减少实例所占的内存.比如: class Date: __slots__ = ['year', 'month', 'day'] def __init__(self, year, month, day): self.year = year self.month = month self.day = day 当你定义__slots

python_如何为创建大量实例节省内存?

案例: 某网络游戏中,定义了玩家类Player(id, name, status,....),每有一个在线玩家,在服务器程序内有一个Player的实例,当在线人数很多时,将产生大量实例(百万级别) 需求: 如何降低这些大量实例的内存开销? 如何做? 首先要明白,python中的类可以动态的添加属性,实则在内存中有个__dict__方法维护了这种动态添加属性,它占有内存,把它关掉,不就达到省内存要求了? #!/usr/bin/python3 import time import sys class

洛谷P3372 【模板】线段树 1(节省内存版)

题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k 操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和 输出格式: 输出包含若干行整