求助:请帮忙解释对齐的概念

liufangbj 2008-03-10 10:01:31
如题
...全文
47 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bxhj3014 2008-03-10
  • 打赏
  • 举报
回复
C/C++中结构体的存储方式
结构体在内存的存放,遵循两个原则:
1、基本类型对齐原则:存储该类型数据时,以他们的倍数处开始存储。
Char 1
Short 2
Int 4
Long 4
Float 4
Double 4
2、结构体类型对齐原则:
以最大成员类型的对齐方式为准,即当需要增长时,增长最大成员类型所占用的字节数。如果该结构体中只有char型,则每次增加一个字节,若最大为short型,则每次增加2个,若最大的为int,则每次增加4个字节。
例子:vc.net2003下运行结果
#include <iostream>
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;
short s;
};
/*与G比较发现,short类型是以2的倍数来对齐的*/
struct H
{
int i;
char c1;
short s;
char c2;
};

int main()
{
cout << "size of A : " << sizeof(A) << endl; /*2字节*/
cout << "size of B : " << sizeof(B) << endl; /*3字节*/
cout << "size of C : " << sizeof(C) << endl; /*4字节*/
cout << "size of D : " << sizeof(D) << endl; /*6字节*/
cout << "size of E : " << sizeof(E) << endl; /*8字节*/
cout << "size of F : " << sizeof(F) << endl; /*12字节*/
cout << "size of G : " << sizeof(G) << endl; /*8字节*/
cout << "size of H : " << sizeof(H) << endl; /*12字节*/
char c;
cin >> c;
return 0;
}
z_kris 2008-03-10
  • 打赏
  • 举报
回复
三种对齐方式:

  1、 自然对齐方式(Natural Alignment):与该数据类型的大小相等。

  2、 指定对齐方式 :

#pragma pack(8) //指定Align为 8;
#pragma pack() //恢复到原先值

  3、 实际对齐方式:

Actual Align = min ( Order Align, Natual Align )

  对于复杂数据类型(比如结构等):实际对齐方式是其成员最大的实际对齐方式:

Actual Align = max( Actual align1,2,3,…)
liufangbj 2008-03-10
  • 打赏
  • 举报
回复
谢谢z_kris
z_kris 2008-03-10
  • 打赏
  • 举报
回复
test2是默认的32位系统下,所以要为4的倍数
但是 如果结构体中最小的那个变量所占空间为N BYTE,且N>4 时,结构体的大小就必须补足为N的倍数
z_kris 2008-03-10
  • 打赏
  • 举报
回复
主要针对字节对齐问题(通常通信中传输struct会涉及长度问题)

#pragma pack(1)
struct test1{
int a;
char b;
};
#pragma pack()

struct test2{
int a;
char b;
};


sizeof(test1)为5
sizeof(test2)为8


#pragma pack(n)
将存储粒度改为n字节
liufangbj 2008-03-10
  • 打赏
  • 举报
回复
俺的公司除了csdn等等能访问,其他的都上不了
z_kris 2008-03-10
  • 打赏
  • 举报
回复
内存对齐?网上很多啊
总的来说就是和存储粒度相关 理解了这个,其他的就不难了
liufangbj 2008-03-10
  • 打赏
  • 举报
回复
感谢楼上的^^

64,690

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧