当前位置:首页 > 内存 > 正文

结构体的内存(struct结构体的内存)

  • 内存
  • 2024-05-27 03:12:11
  • 9173

一、c++中的结构体如何存储C/C++中结构体的存储方法
在内存中存储结构体遵循两个原则:
1基本类型对齐原则:
Char
1
Short
2
整型
4
长整型
4
浮点型
4

8
2.结构体类型对齐原理结构:
遵循最大成员类型对齐,意思是当需要增长时,增加最大成员类型占用的字节数。
示例:2003中的运行结果
#include

using
namespace
std;
struct
A
{
char
c1;
char
c2;
};
/*与A相比,可以看出,当有仅是char类型,以1个字节的速率递增*/
struct
B
{
char
c1;
char
c2;
char
c3;
};
struct
C
{
char
c1;
char
c2;
short
s;
};
/*与C相比,可以看出,引入short类型后,以2的速度增长字节*/
struct
D
{
char
c1;
short
s;
char
c3;
};
struct
E
{
char
c;
short
s;
int
i;
};
/*与E相比,可以看出引入int类型后,以4个字节的速度增加*/
struct
F
{
char
c;
int
i;
short
s;
};
struct
G
{
int
i;
char
c1;
char
c2;

s;
};
/*与G相比,可以看到short类型与2的倍数对齐*/
struct
H
{
int
i;
char
c1;

s;
char
c2;
};
int
main()
{
cout
<<

A

大小:

<<
sizeof(A)
<<
endl;
/*2字节*/
cout
<<
"size
B
:
"
<<
大小(B)
<<
endl;
/*3个字部分*/
cout
<<
"size
of
C
:
"
<<
sizeof(C)
<<
endl;
/*4字节*/
cout
<<
"size
of
D
:
"
<<
sizeof(D)
<<
endl;
/*6字节*/
cout
<<
"大小
of
E
:
"
<
sizeof(E)
<<
endl;
/*8字节*/
cout
<<
"size
of
F
:
"
<<
sizeof(F)
<<
endl;
/*12字节*/
cout
<<
"
G
的大小
:
"
<
sizeof(G)
<<
endl;
/*8字节*/
cout
<<
"大小
of
H
:
"
<<
sizeof(H)
<<
endl;
/*12字节*/
char
c;
cin
>
c;
返回
0;
}


二、C++中2道结构方面选择题,详细解释一下当定义一个结构体变量时,系统为它分配的内存空间是

分配的内存空间为12

32位,与4字节对齐时占用的字节数为12字节。

16位2字节对齐占用的字节数为6字节。

源代码如下:

#includestructs{intacharb;(structs));}

执行结果如下

扩展信息:

结构体的内存空间对齐规则

1数据成员对齐规则:对于结构体(或联合体)的数据成员,第一个数据成员设置为偏移0。以后,每个数据成员将按#指定的值之间较小的值对齐。pragmapack和数据成员本身的长度。

2结构体(或联合体)作用域的一般规则:数据成员完成各自的作用域后,结构体(或联合体)本身必须是基于值的,并且结构体(或联合体)使用较小的值数据成员的最大长度。

3结合1和2,可以得出结论:当#pragmapack的n值等于或超过所有数据成员的长度时,n值的大小将不起作用。

参考来源:-结构


三、结构体数据类型的内存大小检查结构所占用的空间;一般分为三个步骤:
1.首先确定实际的对齐单元,由以下三个因素决定
1>CPU运行
WINvsqt默认为8字节对齐
Linux32位默认4字节对齐,64位默认8字节对齐
2>结构体最大成员(基本数据类型变量)
3>预编译指令#pragmapack(n)自定义n--124816只能填写
取以上三个,最小的一个为实际校准单位(这里“实际校准单位”是一个松散选择的概念)以便于识别)
2结构;所有其他成员都是结构体的地址(其第一个成员地址),对应地址(其第一个成员地址)的偏移量是实际对齐单元或其自身大小(以较小者为准)的整数倍
3.整个结构的大小必须是实际校准单元的整数倍。
所以结构体实际占用的内存大小大于等于结构体中所有成员数据大小之和。