LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: zywwzy

我今天为招聘新员工出的C语言考题

[复制链接]
发表于 2004-7-29 16:00:43 | 显示全部楼层

很奇怪,编译器为什么不会使用对齐?

如果是32位的系统,编译器应该把VAR2的实际地址进行按字的对齐,不应该侵占前面VAR1的地址
到底怎么会事
发表于 2004-7-30 08:48:54 | 显示全部楼层
32位系统可以以32位为最小单位寻址,也可以以8位为最小单位寻址
所以并不是一定要对齐
但对于大于8位的数,如果不按32位对齐,读取时就可能访问两次内存
发表于 2004-7-30 11:20:30 | 显示全部楼层

对齐问题

关于字对齐的问题,我认为是由编译器决定的,我不知道在LINUX下GCC是否可以选择,他的默认编译方式是什么?我前天才开始使用。以前使用WINDOWS是曾经发现,如果不使用字对齐,程序会出现问题,所以,编译器默认的对齐方式是字对齐。
请楼上进行详细的说明
谢谢了
发表于 2004-7-30 12:56:37 | 显示全部楼层
我觉得你说的没错呀
我说的是"为什么对齐可以提高效率"
你说的是"谁来完成对齐的任务"
发表于 2004-7-30 14:31:45 | 显示全部楼层

为什么对齐可以提高效率

我个人的理解,32位系统的指令和数据都是32位的,单指令就可以完成一个32位数据的操作,当然效率高,就比如ARM体系里面,有16位的方式,可以减少代码量,但效率却有所下降。
不知道理解的对不对,请指教。
谁来完成对齐的任务当然很重要,不然写程序的时候老是要注意变量的类型,特别是复合变量,是非常麻烦的。如果知道了编译器的特性,就可以回避许多问题,就象本贴所说的问题,其实是不存在的。
发表于 2004-7-30 14:43:53 | 显示全部楼层
最初由 0100 发表
我已经搜索出与堆栈有关的信息。在纸上也画过,应该是理解的了。
我还漏看了三个变量的定义。谢谢楼主提醒了。
但第一个问题我还是不懂啊。
如果说char str_val[]="32\n"。占用的内存空间是四个字节的话,那应该是'3','2','\n','\0'吧!要不哪来四个字节。如果这样的话,执行var2的赋值后,应该是这样的:
var3:__【字节1】
_______【字节2】
_______【字节3】
_______【字节4】
var2:__【字节1】=======32  ‘3’==99
var1:__【字节1】=24===0    ‘2’==98
_______【字节2】=0====0    ‘\n’
_______【字节3】=0====0
_______【字节4】=0
没有用atoi。为什么会自动把整形数转换成字符了呢?

看来你对sscanf()还不了解;
发表于 2004-7-30 15:30:49 | 显示全部楼层
关于对齐的意义:

下图表示内存中的8个字节,在地址XXXX0000(二进制)处保存着一个数 X = 0x12345678

  1.                 -------------------------------------
  2. 地址XXXX0000:    |   78   |   56   |   34   |   12   |
  3.                 -------------------------------------
  4. 地址XXXX0100:    |   00   |   00   |   00   |   00   |
  5.                 -------------------------------------
复制代码

这种情况下,cpu以地址XXXX0000做一次32位的读操作就得到了X
但如果X保存在地址XXXX0010,如下图所示

  1.                 -------------------------------------
  2. 地址XXXX0000:    |   00   |   00   |   78   |   56   |
  3.                 -------------------------------------
  4. 地址XXXX0100:    |   34   |   12   |   00   |   00   |
  5.                 -------------------------------------
复制代码
               
这种情况下,cpu以要分别以地址XXXX0000和XXXX0100各做一次32位的读操作,然后组合得到X
即当进行32位内存访问时,地址的后两位必须是0 (或者说乎略最后两位,因为硬件上便于实现)

因此,对齐可以节省程序运行时间.
发表于 2004-7-30 16:00:20 | 显示全部楼层
楼上真是高手,佩服
但是我的问题还没人回答:谁来控制对齐
发表于 2004-7-30 16:07:27 | 显示全部楼层
刚才我说过"我觉得你说的没错"

我同你一样认为对齐是由编译器来控制的
发表于 2004-7-30 17:32:55 | 显示全部楼层
谢谢楼上不耐其烦的回答我的问题。GCC不熟悉,我想知道GCC如何处理这个问题?
再次表示感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表