-
-
[原创]深入理解C语言五-结构体的内存结构
-
发表于: 2021-7-25 18:16 5353
-
对于结构体,假设:
1、编译对齐值为zp
2、成员变量在结构体定义中的偏移量为Offset
3、结构体变量自身对齐值为Align
4、结构体变量占用内存大小为Size
则:
1、Offset % min(zp,sizeof(member type)) == 0
2、Align = max(sizeof(member type),Align = min(zp,align)
3、Size % align == 0
其中:
VS2019结构体对齐值默认为8字节:
结构体成员变量的内存分布:
结构体总大小为32字节。
/
*
Offsetof()
=
(size_t)&(((Struct
*
)
0
)
-
>member)
Struct.member
=
*
(member
type
*
)((
int
)&Struct
+
member offset)
*
/
typedef struct _PERSON
{
int
id
;
char name[
16
];
int
age;
}PERSON,
*
PPERSON;
/
/
求结构体的地址到它的成员变量的地址的距离(字节为单位)
int
nIdOffset
=
(size_t) & (((PPERSON)
0
)
-
>
id
);
int
nNameOffset
=
(size_t) & (((PPERSON)
0
)
-
>name);
int
nAgeOffset
=
(size_t) & (((PPERSON)
0
)
-
>age);
printf(
"offset:id:%d,name:%d,age:%d\n"
, nIdOffset, nNameOffset, nAgeOffset);
PERSON tagPerson
=
{
9
,
"xiaoxin"
,
6
};
int
nID
=
*
(
int
*
)((
int
)&tagPerson
+
nIdOffset);
char
*
szName
=
(char
*
)((
int
)&tagPerson
+
nNameOffset);
int
nAge
=
*
(
int
*
)((
int
)&tagPerson
+
nAgeOffset);
printf(
"person:id:%d,name:%s,age:%d\n"
, nID, szName, nAge);
/
*
Offsetof()
=
(size_t)&(((Struct
*
)
0
)
-
>member)
Struct.member
=
*
(member
type
*
)((
int
)&Struct
+
member offset)
*
/
typedef struct _PERSON
{
int
id
;
char name[
16
];
int
age;
}PERSON,
*
PPERSON;
/
/
求结构体的地址到它的成员变量的地址的距离(字节为单位)
int
nIdOffset
=
(size_t) & (((PPERSON)
0
)
-
>
id
);
int
nNameOffset
=
(size_t) & (((PPERSON)
0
)
-
>name);
int
nAgeOffset
=
(size_t) & (((PPERSON)
0
)
-
>age);
printf(
"offset:id:%d,name:%d,age:%d\n"
, nIdOffset, nNameOffset, nAgeOffset);
赞赏
他的文章
- [分享]C++基础十七-异常机制 8580
- [分享]C++基础十六-模板 8941
- [分享]C++基础十五-运算符重载 8964
- [分享]C++基础十四-抽象类 8677
- [分享]C++基础十三-多态 8477
看原图
赞赏
雪币:
留言: