一道IBM笔试题,关于结构体sizeof。

BillShow 2005-03-21 01:32:55
struct{
short a1;
short a2;
short a3;
}A
struct{
long a1;
short a2;
}B
sizeof( A)=6, sizeof( B)=8,为什么?
注:sizeof(short)=2,sizeof(long)=4
...全文
1940 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
sharkabc 2005-04-04
  • 打赏
  • 举报
回复
study Michael_555(Stack)
ChenFengqing 2005-03-26
  • 打赏
  • 举报
回复
偶也是学了很多的,强人多,要更牛,我!
BillShow 2005-03-25
  • 打赏
  • 举报
回复
谢谢各位的解答,让我受益良多!
Q19830409 2005-03-22
  • 打赏
  • 举报
回复
一般般啊
wwxxdd1982 2005-03-22
  • 打赏
  • 举报
回复
牛啊,我是第一次来,长见识了,比一个人干瞪眼强多了
bigant888 2005-03-22
  • 打赏
  • 举报
回复
学习中.....
WingForce 2005-03-22
  • 打赏
  • 举报
回复
sizeof不是函数。。。
wwwzzz8595 2005-03-22
  • 打赏
  • 举报
回复
不熟悉sizeof函数,studing!
galanz 2005-03-22
  • 打赏
  • 举报
回复
mark
nostru 2005-03-22
  • 打赏
  • 举报
回复
UP
罗嘉贇 2005-03-22
  • 打赏
  • 举报
回复
Cybergate() 谢谢你的解答
我将程序改成下面的形式
#include "Stdio.h"
struct a{
char a1;
char a2;
char a3;
}A;
struct b{
short a1;
char a2;
}B;

main()
{
printf("%d\n%d\n%d\n%d\n",sizeof(short),sizeof(char),sizeof(A),sizeof(B));
getch();
}
结果如下
在TC2 BC3中结果都是
2
1
3
3
在vc6.0中是
2
1
3
4
看来是编译器的问题呵呵
williamVII 2005-03-22
  • 打赏
  • 举报
回复
对齐...
Michael_555 2005-03-22
  • 打赏
  • 举报
回复
默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素的长度都小于处理器的位数的时候,便以它里面最长的数据元素为对齐单位;如果结构体内存在长度大于处理器位数的元素,那么就已处理器的位数为对齐单位。但是结构体内类型相同的连续元素将在连续的空间内,和数组一样。
例如:
typedef struct
{
short a1;
short a2;
long a3;
}A;

typedef struct
{
short a1;
long a2;
short a3;
}B;

typedef struct
{
A a1;
short a2;
}C;

sizeof(A) = 8, sizeof(B) = 12, sizeof(C) = 12。这是因为A中的a1,a2将分配在连续的空间内,再用这个连续空间以sizeof(long)=4位单位进行对齐。B中将以long的长度对齐。C中将以处理器(intel Pentium 4)的位数即4字节对齐。
bouluo505 2005-03-22
  • 打赏
  • 举报
回复
struct{
short a1;
short a2;
short a3;
}A
struct{
long a1;
short a2;
}B
sizeof( A)=6, sizeof( B)=8,为什么?
注:sizeof(short)=2,sizeof(long)=4
________________________________________
[C++]中:::在缺省的情况下(编译器都会将结构体中的内容在自然边界上对齐):
sizeof(short)=2 为单字,即要在偶数地址上对齐!
假设a1的地址为:0x00000000h,则a2为0x00000002h,a3为0x00000004h(以上都为相对地址)
所以sizeof(A)=4+2=6;

对于B,sizeof(long)=4;
假设a1的地址为:0x00000000h,而sizeof(short)=2,,即要在偶数地址上对齐!
所以a2的地址为: 0x00000004h
所以sizeof(B)=4+2=6;
但VC++的编译器不同值是8!(按最长对齐)这不符合标准




qifa 2005-03-21
  • 打赏
  • 举报
回复
学习ing
qqfig 2005-03-21
  • 打赏
  • 举报
回复
楼上的说得对!!!!
原因主要有二:一是与数据表示有关,因为计算机存储器以字节编码(也与主存的芯片连接有关),而一般数据类型为
若干字节,对齐可以减少指令读取周期;
二是统一标准和接口,比如对与网络协议,都是需要对齐的(TCP/IP)。
Cybergate 2005-03-21
  • 打赏
  • 举报
回复
geniusboyC0(寂雨): 你用char和short试验一下,看看有没有对齐的情况。如果没有,说明编译器设计的不是太好。

至于long为什么不需要对齐,因为tc是16位编译器,long是通过模拟方式实现的。即便对其了,CPU也要两次访存。所以这种对齐对性能的提高不是太大。
Cybergate 2005-03-21
  • 打赏
  • 举报
回复
谈一谈我的理解:

CPU的优化规则大致原则是这样: 对于n字节的元素(n=2,4,8,...),它的首地址能被n整除,才能获得最好的性能。设计编译器的时候可以遵循这个原则:对于每一个变量,可以从当前位置向后找到第一个满足这个条件的地址作为首地址。


楼主的例子比较特殊,因为即便采用这个原则,得到的结果也应该为6(long的首地址偏移量0000, short首地址偏移量0004,都符合要求)。但是结构体一般会面临数组分配的问题。编译器为了优化这种情况,干脆把它的大小设置为8,这样就没有麻烦了,否则的话,会出现单个结构体的大小为6,而大小为n的结构体数组大小却为8*(n-1)+6的尴尬局面。

我觉得IBM出这道题并不在于考察语言本身和编译器,而在于应聘者对计算机底层机制的理解和设计程序的原则。也就是说,如果让你设计编译器,你将怎样解决内存对齐的问题?
罗嘉贇 2005-03-21
  • 打赏
  • 举报
回复
小弟刚刚在自己机子上运行了这样的一个程序
#include "Stdio.h"
struct a{
short a1;
short a2;
short a3;
}A;
struct b{
short a2;
long a1;
}B;

main()
{
printf("%d\n%d\n%d\n%d\n",sizeof(short),sizeof(long),sizeof(A),sizeof(B));
getch();
}
发现在不同的编译旗下有不同的结果,在TC2 BC3中结果都是
2
4
6
6
只有在vc6.0中是
2
4
6
8
看来这个对齐还要看编译器
tblue7 2005-03-21
  • 打赏
  • 举报
回复
呵呵,这个是编译原理里面的问题,long和short的确要对齐的,而且对齐的方式由机器不同而不同,有的是低位对齐,有的是高位对齐。
加载更多回复(22)

69,395

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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