标题:请高手指教,关于数据对齐以及一些小问题 先谢过
只看楼主
caoyuyong
Rank: 2
等 级:论坛游民
帖 子:20
专家分:10
注 册:2012-8-16
结帖率:100%
已结贴  问题点数:20 回复次数:9 
请高手指教,关于数据对齐以及一些小问题 先谢过
有几个问题,我想了很久,依然有一些搞不清,觉得还是很重要,所以特来讨教下:
第一个,关于数据对齐的。假设,所用电脑是64位,。那么以下的几个结点在没有赋值时
         typedef struct Node{ double a; char b; int d; char c; }node;   
        typedef strcut Stu{ double a; int d; char b; char c;}stu;
        typedef struct List{ double a; int b; int c; short e;long double f; char g;char k;}list;
       那么sizeof(node),sizeof(stu),sizeof(list),他们的值各是多少啊?  list中的long double f 被分配了几个字节呢?

   另外,按字节对齐和按数据对齐,有点搞不清....请指点下,,,谢谢

第二个,假设: int a=5; int b=6;   int c= a>b||a++&&a-(--b)||(b%=5);
          那么c,a,b最后的值时多少啊    这里有点搞不清,  ||和&&的优先级问题,他们是一样的优先级别吧??


可能,问的有点没有水准,见笑了。。。。。真不好意思
搜索更多相关主题的帖子: long double 
2012-08-30 11:07
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
用高级语言还关心什么数据对齐啊 编译器咋定的就咋办
2012-08-30 11:55
caoyuyong
Rank: 2
等 级:论坛游民
帖 子:20
专家分:10
注 册:2012-8-16
得分:0 
问题是,我们常常会用到sizeof语句,这个值,我们应该事先能分析道,我是想知道,该如何通过sizeof来分析和计算一个结点的大小
2012-08-30 11:57
caoyuyong
Rank: 2
等 级:论坛游民
帖 子:20
专家分:10
注 册:2012-8-16
得分:0 
怎么没人理啊?  我很诚恳的啊
虽然问的可能没有水准
2012-08-30 18:19
caoyuyong
Rank: 2
等 级:论坛游民
帖 子:20
专家分:10
注 册:2012-8-16
得分:0 
有时候,给我一个结构,我自己算的和SIZEOF算的大小不一样,这让我很纠结,所以,我.....很纠结
2012-08-30 18:20
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
得分:10 
先找出结构体中最大的单个数据类型,比如double,占8字节,按这个数进行对齐
然后填充:
typedef struct Node{ double a; char b; int d; char c; }node;
double char  int  char
   8   ( 1+3   4)  1+7
由于int要对齐4字节,所以第一个char需要补空3个字节,结尾也要对齐,补空7字节,结果24
typedef strcut Stu{ double a; int d; char b; char c;}stu;
double int  char char
  8   ( 4    1    1 +2)
char不需要补空,直接并列,但要对齐4字节(int已经对齐4字节了),所以补空2字节,结果16
typedef struct List{ double a; int b; int c; short e;long double f; char g;char k;}list;
double int  int  short  long_double char  char
8       4    4    (2+6)     8       (1    1 +6)
前面两个int已经对齐8字节了,short只有2字节,后面是8字节的long_double,所以要补空6字节,以对齐8字节,
最后的两个char同stu,也要补空,但补空6字节,结果40
如果list变成这样
typedef struct List{ double a; int b; int c; short e;char g;char k;long double f;}list;
double int  int  short  char char long_double
  8     4    4    (2      1  1 +4)   8
short有2字节,由于后面是char,所以直接紧跟char,总共2+1+1=4字节,需要补空4字节以对齐8字节,结果32
2012-08-30 23:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
以下是引用caoyuyong在2012-8-30 11:57:50的发言:

问题是,我们常常会用到sizeof语句,这个值,我们应该事先能分析道,我是想知道,该如何通过sizeof来分析和计算一个结点的大小

你算个啥呢?提供sizeof()就是让你不用算的,sizeof(node)就是这个数据的大小,不要去算,一算就错!

授人以渔,不授人以鱼。
2012-08-30 23:14
刘根淼
Rank: 2
等 级:论坛游民
帖 子:13
专家分:39
注 册:2012-7-24
得分:10 
首先第一个问题是关于内存对齐的问题,这个是由于考虑到CPU取内存中的值得效率问题,而设计的。我不知道64位的电脑是按多少字节对齐的,但是在我的
电脑上默认是按4字节对齐的,你也可以使用    #pragma pack  来设定按多少字节对齐。
我拿你的一个结构体作为例子,希望你能理解

有效对齐值 是 自身对齐值和指定对齐值中小的那个值。
结构体的自身对齐值:其成员中自身对齐值最大的那个值。

#pragma pack(4)
typedef struct Node
{
    double a;//double本来是占8个字节,跟默认的按4字节对齐大,所以这个地方有效字节对齐是4,
    char b; //这里的有效字节对齐是1,
    (由于下面是按4字节对齐的,所以这个地方会空出3个字节)
    int d; //有效对齐字节是4,
    char c; //有效对齐字节是1
}node;  
这样总共的大小是17,但是由于整个结构体还要按字节对齐,结构体按字节对齐是按结构体成员中的占最大是8,所以有效对齐是4
所以这个结构体的占20个字节
2012-08-31 09:12
caoyuyong
Rank: 2
等 级:论坛游民
帖 子:20
专家分:10
注 册:2012-8-16
得分:0 
谢谢6楼,和8楼的解说,我现在确定了,,原本只理解了一部分,那这一部分给遗忘了:这样总共的大小是17,但是由于整个结构体还要按字节对齐,结构体按字节对齐是按结构体成员中的占最大是8,所以有效对齐是4 !!!!!!!!
  所以,我说嘛,怎么自己就算不对了呢,,,,
 貌似,他们每个成员的首地址要被它本身的长度整除才可以吧?   
谢谢了
2012-08-31 11:58
大飞玩编程
Rank: 2
等 级:论坛游民
帖 子:21
专家分:12
注 册:2012-7-24
得分:0 
学习学习
2012-08-31 15:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-380338-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.752111 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved