标题:一道小测验题,答对了就可以作软件工程师了
只看楼主
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
 问题点数:0 回复次数:10 
一道小测验题,答对了就可以作软件工程师了
这是我前一家公司(美国S&P500公司)的朋友要招人时出的题,应考的都是各校的本科毕业生,据说还没人答对。大家试试吧。

需要定义一个structure,问下面哪个比较好,为什么。
struct A
{
char char1[5];
float fData;
long lData;
char char2[1];
};

struct B
{
long lData;
float fData;
char char1[5];
char char2[1];
};

小提示:这个公司是作实时系统的。
搜索更多相关主题的帖子: 答对 软件工程师 
2006-04-12 16:16
lmatt
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2006-3-30
得分:0 
这有什么区别吗?想不通!

2006-04-12 16:56
chastity
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-1-11
得分:0 

当然是B好了


2006-04-12 20:16
一剑终秦
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2006-4-2
得分:0 
以下是引用chastity在2006-4-12 20:16:00的发言:

当然是B好了

为什么呀

2006-04-12 20:26
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 

如果仅从占用空间考虑,其实两个都可以做到一样
#include <stdio.h>
#pragma pack(1)
struct A
{
char char1[5];
float fData;
long lData;
char char2[1];
}a;

struct B
{
long lData;
float fData;
char char1[5];
char char2[1];
}b;
#pragma pack()
struct C
{
char char1[5];
float fData;
long lData;
char char2[1];
}c;

struct D
{
long lData;
float fData;
char char1[5];
char char2[1];
}d;
int main()
{
printf("A=%d\n",sizeof(A));
printf("A.char1(%d)+A.fData(%d)+A.lData(%d)+A.char2(%d)\n\n",sizeof(a.char1),sizeof(a.fData),sizeof(a.lData),sizeof(a.char2));
printf("B=%d\n",sizeof(B));
printf("B.char1(%d)+B.fData(%d)+B.lData(%d)+B.char2(%d)\n\n",sizeof(b.char1),sizeof(b.fData),sizeof(b.lData),sizeof(b.char2));
printf("C=%d\n",sizeof(C));
printf("C.char1(%d)+C.fData(%d)+C.lData(%d)+C.char2(%d)\n\n",sizeof(c.char1),sizeof(c.fData),sizeof(c.lData),sizeof(c.char2));
printf("D=%d\n",sizeof(D));
printf("D.char1(%d)+D.fData(%d)+D.lData(%d)+D.char2(%d)\n\n",sizeof(d.char1),sizeof(d.fData),sizeof(d.lData),sizeof(d.char2));
return 0;
}

访问时速度上是否会有区别不得而知


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2006-04-12 21:26
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
得分:0 
都知道是B好,不过为什么?
提示:从存储顺序上考虑,char是8bit,也就是半个整数和float的大小。

http://myajax95./
2006-04-12 22:15
bym555
Rank: 2
等 级:论坛游民
帖 子:18
专家分:24
注 册:2009-7-17
得分:0 
所占空间应该是一样大,同类的放在一起可能比较好。
2009-07-27 08:58
mfh
Rank: 6Rank: 6
等 级:侠之大者
帖 子:179
专家分:411
注 册:2009-5-31
得分:0 
我觉应是内存的存储界线的原因,
2009-07-27 11:07
lin52045
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:41
专家分:113
注 册:2009-7-24
得分:0 
个人认为还是A比较好,因为是做实时操作系统的,所以数据要第一时间存入,就是说要第一时间创建char char1[5]
仅为个人看法..

C语言入门新手,大家一起讨论学习!
2009-07-27 11:45
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
得分:0 
应该是和cpu读写数据的方式有关系,cpu一次读数据是按总线位数读的,这也是c的某些结构需要对齐的原因。
    A里面的char[5]在前面,如果是32位的总线,那么在读char[5]的时候需要读2次,第二次读到的32位,后24位会被丢弃掉(这24位被用于对齐)。读long、float和char[1]各需要一个cpu读周期(假设long和float的长度都是4),所以cpu读结构A最快需要5个cpu读周期。
    B里面先读long和float各需要一个cpu读周期,然后读char[5]和char[1]一共需要2个cpu读周期,第二次读到的32位,后16位会被丢弃掉。所以cpu读结构B最快需要4个周期。

所以在实时系统里B会比A更好。

身体是玩命的本钱
2009-07-28 13:51



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




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

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