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。