c/c++ sizeof总结
2015-08-04 12:35
281 查看
偏移量:指的是结构体变量中成员的地址和结构体变量地址的差。
结构体大小等于最后一个成员的偏移量加上最后一个成员的大小.
0被认为是任何数的整数倍
求结构体大小的2个原则:
1.偏移量为该成员大小的n倍.
2.总大小必须为最大成员大小的n倍.
用偏移量计算
struct s1
{
char a;//0
int b;//1 4
char c;//8
};//9
12
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为1 4(1不是4的倍数所以,需要1 + 3)
c 的偏移量 为8
总大小为8+1 = 9
以上满足第一个条件.
第二个条件:9不是4的倍数,所以9+3
最后结果:12
struct s2
{
char a;//0
char b;//1
int c;//2
};//6
8
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为1
c 的偏移量 为2
总大小为2+4 = 6
以上满足第一个条件.
第二个条件:6不是4的倍数,所以6+2
最后结果:8
struct s3
{
int a;//0
char b;//4
short c;//5 6
double d;//8
int f;//16
}s3;//20
24
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为4
c 的偏移量 为5 6(5不是2的倍数,所以需要5+1)
d 的偏移量 为8
f 的偏移量 为16
总大小为16+4 = 20
以上满足第一个条件.
第二个条件:20不是8的倍数,所以20+4
最后结果:24
在结构体中包含有结构体,将结构体中最大成员大小作为整除。
struct s1
{
char a;
int b;
char c;
};//12
struct s2
{
char a;//0
s1 s;//1 4
char b;//16
int c;//17
};//21
24
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
s 的偏移量 为1 4(s1中最大成员字节数为4,所以应把4作为除数,1不是4的倍数,所以需要1+3)
b 的偏移量 为16 (s1的整体占字节数为12个,所以偏移量为4+12)
c 的偏移量 为17
总大小为17+4 = 21
以上满足第一个条件.
第二个条件:21不是4的倍数,所以21+3
最后结果:24
struct s3
{
int a;//0
char b;//4
short c;//5 6
s2 ss;//8
double d;//32
int f;//40
}s3;//44
//48
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为4
c 的偏移量 为5 6(5不是2的倍数,所以需要5+1)
ss 的偏移量 为 8
d 的偏移量 为32 (8 + 24)
f 的偏移量 为40
总大小为40+4 = 44
以上满足第一个条件.
第二个条件:44不是8的倍数,所以44+4
最后结果:48
各种sizeof求大小的面试题。
http://blog.csdn.net/wangshihui512/article/details/9116051#comments
结构体大小等于最后一个成员的偏移量加上最后一个成员的大小.
0被认为是任何数的整数倍
求结构体大小的2个原则:
1.偏移量为该成员大小的n倍.
2.总大小必须为最大成员大小的n倍.
用偏移量计算
struct s1
{
char a;//0
int b;//1 4
char c;//8
};//9
12
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为1 4(1不是4的倍数所以,需要1 + 3)
c 的偏移量 为8
总大小为8+1 = 9
以上满足第一个条件.
第二个条件:9不是4的倍数,所以9+3
最后结果:12
struct s2
{
char a;//0
char b;//1
int c;//2
};//6
8
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为1
c 的偏移量 为2
总大小为2+4 = 6
以上满足第一个条件.
第二个条件:6不是4的倍数,所以6+2
最后结果:8
struct s3
{
int a;//0
char b;//4
short c;//5 6
double d;//8
int f;//16
}s3;//20
24
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为4
c 的偏移量 为5 6(5不是2的倍数,所以需要5+1)
d 的偏移量 为8
f 的偏移量 为16
总大小为16+4 = 20
以上满足第一个条件.
第二个条件:20不是8的倍数,所以20+4
最后结果:24
在结构体中包含有结构体,将结构体中最大成员大小作为整除。
struct s1
{
char a;
int b;
char c;
};//12
struct s2
{
char a;//0
s1 s;//1 4
char b;//16
int c;//17
};//21
24
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
s 的偏移量 为1 4(s1中最大成员字节数为4,所以应把4作为除数,1不是4的倍数,所以需要1+3)
b 的偏移量 为16 (s1的整体占字节数为12个,所以偏移量为4+12)
c 的偏移量 为17
总大小为17+4 = 21
以上满足第一个条件.
第二个条件:21不是4的倍数,所以21+3
最后结果:24
struct s3
{
int a;//0
char b;//4
short c;//5 6
s2 ss;//8
double d;//32
int f;//40
}s3;//44
//48
a 的偏移量 为0 (成员a的地址和结构体变量地址相同)
b 的偏移量 为4
c 的偏移量 为5 6(5不是2的倍数,所以需要5+1)
ss 的偏移量 为 8
d 的偏移量 为32 (8 + 24)
f 的偏移量 为40
总大小为40+4 = 44
以上满足第一个条件.
第二个条件:44不是8的倍数,所以44+4
最后结果:48
各种sizeof求大小的面试题。
http://blog.csdn.net/wangshihui512/article/details/9116051#comments
相关文章推荐
- 注册表的组织结构
- C#中struct和class的区别详解
- SQLSERVER的非聚集索引结构深度理解
- 调整SQLServer2000运行中数据库结构
- C#基础语法:结构和类区别详解
- 深入c# 类和结构的区别总结详解
- c#结构和类的相关介绍
- C#中结构(struct)的部分初始化和完全初始化实例分析
- C#中类与结构的区别实例分析
- C#枚举类型与结构类型实例解析
- C#中sizeof的用法实例分析
- javascript实现表现、结构、行为分离的选项卡效果!
- 浅析C语言中的sizeof
- 深入sizeof的使用详解
- C语言中的sizeof操作符用法及和strlen的区别
- C++ 关于STL中sort()对struct排序的方法
- sizeof()的简单介绍
- C# Struct的内存布局问题解答
- 基于Sizeof与Strlen的区别以及联系的使用详解
- 浅析C/C++中被人误解的SIZEOF