||
以前没怎么仔细分析过结构体,对于其使用也是一知半解,今天有幸看到了《嵌入式C精华》这份资
料,讲的真好(后面的还不知道...)。
首先要知道的是#pragma这个东东----
一句话,pragma就是为了让编译器编译出的C或C++程序与机器硬件和操作系统保持完全兼容
而定义的宏扩展,#pragma是和特定编译器相关的。
1.下面对这段程序分析一下,基本上对结构体的对齐就有了基本的概念了:
#include <iostream.h>
#pragma pack(8) //最大8字节对齐
struct example1
{
short a;//2字节
long b; //与int一样,4字节,这里使 short对齐为4字节
};
struct example2
{
char c;//1字节
example1 struct1;//8字节,但分析example2的变量时要把struct1展开分析
short e;//2字节
};
#pragma pack()//不采用对齐
int main(int argc, char* argv[])
{
example2 struct2;//定义一个结构体变量struct2
cout << sizeof(example1) << endl;//4+4=8字节
cout << sizeof(example2) << endl;//四个成员中(两个是struct1的),最大的为4字
//节,则都对齐为4字节,即4*4=16字节
cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) << endl;
//&struct2表示其第一个成员char c,而它已对齐为4字节.故8-4=4字节
return 0;
}
2.结构体中有指针的情况
structA instant1,instant2;//定义两个结构体变量
instant2 = instant1 赋值语句采用的是变量逐个拷贝,这使得instant1 和instant2 中的
cMember 指向了同一片内存,因而对instant2 的修改也是对instant1 的修
改。
在C 语言中,当结构体中存在指针型成员时,一定要注意在采用赋值语句时是否将2 个实例中
的指针型成员指向了同一片内存。
在C++语言中,当结构体中存在指针型成员时,我们需要重写struct 的拷贝构造函数并进行
“=”操作符重载。