社区
C++ 语言
帖子详情
求助:请帮忙解释对齐的概念
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
打赏
举报
回复
感谢楼上的^^
《C经典面试》编译链接、指针、内存bug、函数、其它
指针:指针
概念
、数组相关的指针、字符串指针、函数指针等 3.内存bug:内存越位、内存覆盖、使用非法内存、内存泄露等。 4.函数:自定义函数、内联函数、回调函数、变参函数、递归函数、库函数等 5.其它:自动类型...
我在CSDN参与的3000个帖子
2:100分急求,随机输出十个小写字母,但是,要求这十个字母不相同 3:求Sn=a+aa+aaa+…+aaa…a(n个a)之值 4:数组题 望高手
帮忙
! 5:呵呵,来推荐一下我的网站,本站提供大量当今流行的免费的音乐和免费电影,...
ChatGPT 解密
这些提示可以帮助用户了解特定想法、产品或
概念
的优缺点。ChatGPT:在为老年和年轻观众创建营养和健康内容时,
请
考虑以下因素:● 年龄特定的营养需求:老年人通常需要更多某些营养素,如钙和维生素 D,而年轻人可能...
计算机网络知识点大全!(太详细了)
????...基本
概念
- 链路,结点,协议和服务,实体和对等实体,各层PDU链路:连接结点的称为链路,可以是铜缆,光纤,卫星等;结点:可以是计算机,集线器,交换机或路由器等;协议:两个对等实体...
ReactNative进阶(十二):本地存储 AsyncSt
腾讯teg云架构平台-后台...支持多并发语言的锁 [叹息] 中电10所软开面经 Webserver 智能指针线程池他都不懂,让我一顿给他
解释
,我简历的东西他都不太懂,全程给他
解释
,是不是没机会了想去研究所一般第二天会有二面?...
C++ 语言
64,690
社区成员
250,497
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章