C语言结构体(struct) ----内存对齐
再没有#pragma pack宏定义的情况下基本如下:
- 该数据成员存放起始地址(“&”取地址符得到的地址)在该成员大小的整数倍上开始
比如:一个结构体中存在一个int类型的数据成员,则该数据成员存在位置只能相对于该结构体实例化后的相对地址:0、4、8、12…的位置出现。
#include <iostream>
#include <string>
using namespace std;
struct student{
int age;
}
struct teacher{
char name;
int age;
}
void main(){
student std;
std.age = 1;
teacher tch ;
tch.name = '1'; tch.age = 1;
printf("学生的位置为:%d\n",&std);
printf("学生中年龄的位置为:%d\n",&std.age);
printf("老师的位置为:%d\n",&tch);
printf("老师中年龄的位置为:%d\n",&tch.age);
//打印结果位:
学生的位置为:7339488
学生中年龄的位置为:7339488
老师的位置为:7339472
老师中年龄的位置为:7339476
}
2.如果结构体内部的数据成员也是一个结构体,这种情况下内部的结构体不会被看作一个整体,而是以内部结构体当中最大元素的大小作为判断依据,进行上一条规则进行:`
#include <iostream>
#include <string>
using namespace std;
```struct teacher{
int name;
char age;
};
struct student{
char age;
teacher teacher;
int name;
char age2;
char age3;
char age4;
char age5;
};
void function(){
student std ;
std.age = '1';std.age2 = '1';std.age3 = '1';std.age4 = '1';std.age5 = '1';std.name = 1;std.teacher.name = 1; std.teacher.age = '1';
printf("总地址为: %d\n" , &std);
printf("1号地址为: %d\n" , &std.age);
printf("teacher号地址为: %d\n" , &std.teacher);
printf("teacher的名字号地址为: %d\n" , &std.teacher.name);
printf("teacher的年纪地址为: %d\n" , &std.teacher.age);
printf("name号地址为: %d\n" , &std.name);
printf("2号地址为: %d\n" , &std.age2);
printf("3号地址为: %d\n" , &std.age3);
printf("4号地址为: %d\n" , &std.age4);
printf("5号地址为: %d\n" , &std.age5);
//画内存
for(int i = 0 ; i < sizeof(student) ; i ++){
printf("*\n");
}
}
//打印结果如下:
总地址为: 7339472
1号地址为: 7339472
teacher号地址为: 7339476
teacher的名字号地址为: 7339476
teacher的年纪地址为: 7339480
name号地址为: 7339484
2号地址为: 7339488
3号地址为: 7339489
4号地址为: 7339490
5号地址为: 7339491
内存占用画出来就是如下这个样子(空心表示空闲):
■ □ □ □ ■ □ □ □ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
细心地小伙伴可以能会发现:
首地址 - ( 最后一个成员首地址 + 该成员大小 ) = 19
我画小方格画了 20 个 ,这就是下面说的最后一个规则啦 ~~
- 结构体的总大小:也就是sizeof的结果:整体大小是内部最大成员大小的整数倍。
对于我们上面的测试而言,其中最大成员为int(4byte),所以最后结构体大小就从19扩展到20啦。
#include <iostream>
#include <string>
using namespace std;
```struct teacher{
int name;
char age;
};
struct student{
char age;
teacher teacher;
int name;
char age2;
char age3;
char age4;
char age5;
};
void function(){
cout<<sizeof(student)<<endl;
}
//
输出的结果为:20