内存对齐

fairchild811 2009-07-16 10:48:04
typedef union {long i; int k[5]; char c;} DATE;

struct data { int cat; DATE cow; double dog;} too;

cout << sizeof(data) << " " << sizeof(DATE);

为什么 第一个输出是32(codeblocks,winxp),按照内存对齐不应该是60吗?
...全文
164 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolstand 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

对于该联合体来说最大的int k[5],分开来看就是5个int,对于struct data { int cat; DATE cow; double dog;} too这个结构体可以这么看{int,int,int,int,int,int,double}最大是对齐(double)是8个字节,可以分成4组,前面六个int组成3组,一个double单独一组,总的大小也就是32个字节了
[/Quote]

10楼说的最有道理,其他什么4+20+8的看法都没弄清楚是怎么摆放的。
fairchild811 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hairetz 的回复:]
引用楼主 fairchild811 的帖子:
typedef union {long i; int k[5]; char c;} DATE;

struct data { int cat; DATE cow; double dog;} too;

cout < < sizeof(data) < < " " < < sizeof(DATE);

为什么 第一个输出是32(codeblocks,winxp),按照内存对齐不应该是60吗?


typedef union
{long i;            //[0].. [3]
int k[5];            //[0]...[19]
char c;}            //[0]
DATE;

20字节


struct data {
int cat;      //[0]..[3]
DATE cow;      //[4]...[23]  按union的最大内置类型对齐 --> 按内置类型?也就是说不是按int k[5]的20,而是long的4,如果是double k[5],是按long的4,还是double的8,谢谢了
double dog;}  //[24]...[31]
too;


一共32字节啊

[/Quote]
cmkyec 2009-07-19
  • 打赏
  • 举报
回复
mark
hefan0120 2009-07-18
  • 打赏
  • 举报
回复
我都忘记了现在又想起来了
life02 2009-07-18
  • 打赏
  • 举报
回复
lsls的正解,如果它还取20的话,就不知道怎么存储double了
我是这么理解的,不知道对不对?
判高手给出内存模型
life02 2009-07-18
  • 打赏
  • 举报
回复
32 20
cheng_fengming 2009-07-18
  • 打赏
  • 举报
回复
对于这个结果可能大家都没有疑问了,但是我发现了这样一个现象:
对于联合体,我们都知道是去其中最大的,但是如下定义:
typedef union
{
short i;
char k[17];
int c;
} DATE; //此时sizeof(DATE)=20
typedef union
{
short i;
char k[17];
double c;
} DATE; //此时sizeof(DATE)=24
那也就是说遇到字符数组且其占的字节数最大的时候,就取到与之最接近的4的倍数的整数,遇到有double的时候就取8的倍数。
ID大头哈哈 2009-07-18
  • 打赏
  • 举报
回复
结构体内包含数组int k[5]; 在sizeof求值的时候可以展开成5个int成员再作对齐
十八道胡同 2009-07-18
  • 打赏
  • 举报
回复
[Quote=引用楼主 fairchild811 的回复:]
typedef union {long i; int k[5]; char c;} DATE;

struct data { int cat; DATE cow; double dog;} too;

cout < < sizeof(data) < < " " < < sizeof(DATE);

为什么 第一个输出是32(codeblocks,winxp),按照内存对齐不应该是60吗?
[/Quote]

联合,去最大的那个...就是8+ 5*4+4
zenghao1422 2009-07-17
  • 打赏
  • 举报
回复
联合的内存大小按照其成员的大小,取最大的。
学习了。。。
yshuise 2009-07-17
  • 打赏
  • 举报
回复
对齐在自己写内存池的时候要用到。boost::pool中用到的内存对齐比较具有独创性。
它是利用最大公约素的方法,代码是用的模板元,所以效率较高。可惜侯捷在《程序员》杂志上写的
这篇文章没有讨论如此重要的理论。std::allocator对齐方法较为简单。算法估计是抄的linux源代码上的内容。
loki库的对齐比std难点,但是也没有什么特色。
NKLoveRene 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Loaden 的回复:]
我觉得:sizeof(DATA)应该是28
sizeof(data)是36
没验证,睡了。
[/Quote]有点对不起那两颗红星了~~~
amossavez 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Loaden 的回复:]
我觉得:sizeof(DATA)应该是28
sizeof(data)是36
没验证,睡了。
[/Quote]
老邓迷糊了吧!
cnpxm 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用楼主 fairchild811 的帖子:]
typedef union {long i; int k[5]; char c;} DATE;

struct data { int cat; DATE cow; double dog;} too;

cout < < sizeof(data) < < " " < < sizeof(DATE);

为什么 第一个输出是32(codeblocks,winxp),按照内存对齐不应该是60吗?
[/Quote]
DATA 的大小是20。因为其中最长的那个是int k[5]; k的大小一共是5*4=20
data 的大小 = sizeof(int) + sizeof(DATA) + sizeof(double) = 4 + 20 + 8 =32
  • 打赏
  • 举报
回复
http://blog.csdn.net/hairetz/archive/2009/04/16/4084088.aspx

5分钟搞定内存字节对齐

看完我说的3个原则,就不会有问题了。
  • 打赏
  • 举报
回复
[Quote=引用楼主 fairchild811 的帖子:]
typedef union {long i; int k[5]; char c;} DATE;

struct data { int cat; DATE cow; double dog;} too;

cout < < sizeof(data) < < " " < < sizeof(DATE);

为什么 第一个输出是32(codeblocks,winxp),按照内存对齐不应该是60吗?
[/Quote]

typedef union
{long i; //[0].. [3]
int k[5]; //[0]...[19]
char c;} //[0]
DATE;

20字节



struct data {
int cat; //[0]..[3]
DATE cow; //[4]...[23] 按union的最大内置类型对齐
double dog;} //[24]...[31]
too;


一共32字节啊
hoomey 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pengzhixi 的回复:]
typedef union {long i; int k[5]; char c;} DATE; //注意这是个联合,他的大小为20

struct data { int cat; DATE cow; double dog;} too; //大小是 4+20+8=32 是double大小的 4倍。刚好。

cout < < sizeof(data) < < " " < < sizeof(DATE);
[/Quote]

东辉在线 2009-07-17
  • 打赏
  • 举报
回复
对于该联合体来说最大的int k[5],分开来看就是5个int,对于struct data { int cat; DATE cow; double dog;} too这个结构体可以这么看{int,int,int,int,int,int,double}最大是对齐(double)是8个字节,可以分成4组,前面六个int组成3组,一个double单独一组,总的大小也就是32个字节了
「已注销」 2009-07-16
  • 打赏
  • 举报
回复
哦,联合...
眼睛...,眯一会...
pengzhixi 2009-07-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Loaden 的回复:]
我觉得:sizeof(DATA)应该是28
sizeof(data)是36
没验证,睡了。
[/Quote]

联合的内存的大小按照其成员的大小,取最大的 。
加载更多回复(5)

65,187

社区成员

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

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