struct和Union的内存分配方式

qq51931375 2009-08-26 08:09:16
那天去面试,问到这个问题,只是回答了一个大概,只是说了C语言中,struct分配的内存是所有的成员变量所占字节之和.
union是占字接数最多的变量.

在C++中struct和union都采用了对齐原则,我想知道这个对齐原则是到底是怎么样的,忘指点,最好给出例子
网上的我看多,很多都是复制别人的,而且说法自相矛盾.
谢谢.
...全文
199 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qq51931375 的回复:]
恩 是我错了
还有union呢|?
[/Quote]
union用的不太多,很少要对齐吧,其内部成员都是从[0]开始的。
  • 打赏
  • 举报
回复
郁闷,我写得不矛盾吧,请耐心看完,如果真有问题请指正。
但是自以为3原则总结的还可以。
wanjingwei 2009-08-26
  • 打赏
  • 举报
回复
学习了
qq51931375 2009-08-26
  • 打赏
  • 举报
回复
恩 是我错了
还有union呢|?
mstlq 2009-08-26
  • 打赏
  • 举报
回复
回楼上,原则二写的是结构体作为成员,请问int是结构体吗^_^?
请心平气和慢慢看^_^
qq51931375 2009-08-26
  • 打赏
  • 举报
回复
2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟:

typedef struct bb
{
int id; //[0]....[3]
double weight; //[8].....[15]      原则1
float height; //[16]..[19],总长要为8的整数倍,补齐[20]...[23]     原则3
}BB;

typedef struct aa
{
char name[2]; //[0],[1]
int id; //[4]...[7]          原则1

double score; //[8]....[15]    
short grade; //[16],[17]        
BB b; //[24]......[47]          原则2
}AA;

上面这段代码是2楼给我的网址里去访问的,我想说的是我弄不明白,这里又产生了自相矛盾,
明明原则2:则结构体成员要从其内部最大元素大小的整数倍地址开始存储

但是struct aa中的int id;却是从索引4开始存储的id的值.请问4是8的整数倍吗?
越看越气...哎


mr_leo17895 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mr_leo17895 的回复:]
struct的每个成员变量按照指定对齐字节与变量本身字节数中较小的值来对齐
struct整体的大小按照成员变量中字节最小的变量字节数与指定对齐字节中较小的值来对齐
[/Quote]
修改一下,
第二个是...字节最大的变量字节数...
pengzhixi 2009-08-26
  • 打赏
  • 举报
回复
呵呵,帮顶!!加一句,对齐是为了bus时的效率
mr_leo17895 2009-08-26
  • 打赏
  • 举报
回复
struct的每个成员变量按照指定对齐字节与变量本身字节数中较小的值来对齐
struct整体的大小按照成员变量中字节最小的变量字节数与指定对齐字节中较小的值来对齐
mstlq 2009-08-26
  • 打赏
  • 举报
回复
http://blog.csdn.net/hairetz/archive/2009/04/16/4084088.aspx

hairetz写的……

64,654

社区成员

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

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