C++ GUI Qt 4学习——工程笔记(1)

今天看了代码,主要回忆了一下Qt相关内容,看不懂的内容主要是网络传输和内存管理两方面。

 

1、大小端存储

在传输中,有以下代码:

1 void aLabel::REVERSE_16 (short int *v ) {
2      char t = *(char *)(v);  //取低8位
3      *((char *)(v)) = *(((char *)(v)) + 1);  //低8位里存高8位
4      *(((char*)(v)) + 1) = t;  //高八位里存t
5 }

该段代码目的在于,大小端转换。抄点相关知识(http://blog.csdn.net/ameyume/article/details/6276591):

如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。为简单起见,本书使用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。 

地址偏移

大端模式

小端模式

0x00

12(OP0)

78(OP3)

0x01

34(OP1)

56(OP2)

0x02

56(OP2)

34(OP1)

0x03

78(OP3)

12(OP0)

 

如果将一个16位的整数0x1234存放到一个短整型变量(short)中。这个短整型变量在内存中的存储在大小端模式由下表所示。

地址偏移

大端模式

小端模式

0x00

12(OP0)

34(OP1)

0x01

34(OP1)

12(OP0)

 

简单地来说,大端方式将高位存放在低地址,小端方式将高位存放在高地址。大端比较符合正常人思维,小端比较方便计算机处理。

 

2、#pragma pack(n)

  从百科里扒下来的内容。(http://baike.baidu.com/view/2317161.htm)

  VC中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n>=该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n<该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数;否则必须为n的倍数。

 

  下面举例说明其用法。

 1 #pragma pack(push)  //保存对齐状态
 2 #pragma pack(4)  //设定为4字节对齐
 3 struct test {
 4   char m1;
 5   double m4;
 6   int m3;
 7 };
 8 #pragma pack(pop)  //恢复对齐状态

  以上结构体的大小为16,下面分析其存储情况,首先为m1分配空间,其偏移量为0,满足我们自己设定的对齐方式(4字节对齐),m1大小为1个字节。接着开始为m4分配空间,这时其偏移量为4,需要补足3个字节,这样使偏移量满足为n=4的倍数(因为sizeof(double)大于4),m4占用8个字节。接着为m3分配空间,这时其偏移量为12,满足为4的倍数,m3占用4个字节。这时已经为所有成员变量分配了空间,共分配了16个字节,满足为n的倍数。如果把上面的#pragma pack(4)改为#pragma pack(8),那么我们可以得到结构的大小为24。

posted @ 2012-07-10 16:22  ReasonHan  阅读(397)  评论(0编辑  收藏  举报