• 关于位域如何节省内存(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  }
    View Code

        

     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  }
  • 相关阅读:
    springboot项目启动成功后执行一段代码的两种方式
    ELK相关资料整理
    Golang指针解析
    Golang文件操作
    Go Channel介绍
    Go语言new和make的区别
    SpringBoot+AOP实现记录操作日志和异常日志,并保存到数据库
    【面试专栏】Java 阻塞队列
    Linux安装Jenkins并构建SpringBoot工程
    Linux安装git
  • 原文地址:https://www.cnblogs.com/gongxijun/p/4334448.html
Copyright © 2020-2023  润新知