C++--struct的用法

1.struct的自然对界

 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如array、struct、union等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界(natural alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。

  自然对界(natural alignment)即默认对齐方式,是指按结构体的成员中size最大的成员对齐。

  例如:

struct naturalalign
{
char a;
short b;
char c;
};

 在上述结构体中,size最大的是short,其长度为2字节,因而结构体中的char成员a、c都以2为单位对齐,sizeof(naturalalign)的结果等于6;

如果改为:struct naturalalign
{
char a;
int b;
char c;
};

其结果显然为12。

2.位操作

位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构 

比按位运算符更加方便。 

    位结构定义的一般形式为: 

     struct位结构名{ 

          数据类型 变量名: 整型常数; 

          数据类型 变量名: 整型常数; 

     } 位结构变量; 

    其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整 

数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。 

    变量名是选择项, 可以不命名, 这样规定是为了排列需要。 

    例如: 下面定义了一个位结构。 

     struct{ 

          unsigned incon: 8;  

/*incon占用低字节的0~7共8位*/ 

          unsigned txcolor: 

4;/*txcolor占用高字节的0~3位共4位*/ 

          unsigned bgcolor: 

3;/*bgcolor占用高字节的4~6位共3位*/ 

          unsigned blink: 1;  /*blink占用高字节的第7位*/ 

     }ch; 

    位结构成员的访问与结构成员的访问相同。 

    例如: 访问上例位结构中的bgcolor成员可写成: 

      ch.bgcolor 

  

    注意: 

    1. 位结构中的成员可以定义为unsigned, 也可定义为signed,  但当成员长 

度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。 

    2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针, 

如果是指针, 其成员访问方式同结构指针。 

    3. 位结构总长度(位数), 是各个位成员定义的位数之和,  可以超过两个字 

节。 

    4. 位结构成员可以与其它结构成员一起使用。 

    例如: 

     struct info{ 

          char name[8]; 

          int age; 

          struct addr address; 

          float pay; 

          unsigned state: 1; 

          unsigned pay: 1; 

          }workers;’ 

    上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结 

构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工 

人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。

3.指定边界

一般地,可以通过下面的方法来改变缺省的对界条件:

  · 使用伪指令#pragma pack (n),编译器将按照n个字节对齐;
  · 使用伪指令#pragma pack (),取消自定义字节对齐方式。

  注意:如果#pragma pack (n)中指定的n大于结构体中最大成员的size,则其不起作用,结构体仍然按照size最大的成员进行对界。

 例如:

#pragma pack (n)
struct naturalalign
{
char a;
int b;
char c;
};
#pragma pack ()

 

原文链接:http://blog.21ic.com/user1/2765/archives/2009/55977.html

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值