字节对齐?

weiyijiji 2008-07-03 11:04:39
#include <stdio.h>

int main(){
char c='A';
char a='a';
printf("addr c is %#x\n",&c);
printf("addr a is %#x\n",&a);
return 0;
}
为是么输出是
addr c is 0x12ff7c
addr a is 0x12ff78
...全文
288 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
fuqd273 2008-07-07
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 qmm161 的回复:]
引用 25 楼 fuqd273 的回复:
引用 14 楼 lyle3 的回复:
肯定和编译器有关呀,自己也能设置..
引用 13 楼 weiyijiji 的回复:
引用 8 楼 Jerrylearnc 的回复:
为什么我运行了一下
显示的是
addr c is 0xffd2
addr a is 0xffd3
这和编译器有关系吗?
我用的是win-tc
谢谢
非常感谢

网上确实有说和编译器有关,对齐也是编译器用来提高效率的 具体的也不是很清楚


恰恰相反,和编译器无关。
是和总线…
[/Quote]

编译器可以通过参数调整字节对齐方式。请参考前文,前面有人给了部分例子了。
TC的话,ide里面应该提供了编译参数的修改方法,我这里没环境,现在没办法确认给你看。
vc6肯定可以修改对齐方式。
更新的vc2003/2005/2008我不清楚有没有提供。

编译器默认提供的,是效率最高的内存寻址方式。
这是结果,不是原因。

。。。
不多说了。
BMCRNET 2008-07-07
  • 打赏
  • 举报
回复
有意思吗?

wxrs 2008-07-05
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 linux_and_unix 的回复:]
我用visual c/c++调试结果是
addr c is 0x12ff63
addr a is 0x12ff57
[/Quote]

你来打酱油?
qmm161 2008-07-05
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 fuqd273 的回复:]
引用 14 楼 lyle3 的回复:
肯定和编译器有关呀,自己也能设置..
引用 13 楼 weiyijiji 的回复:
引用 8 楼 Jerrylearnc 的回复:
为什么我运行了一下
显示的是
addr c is 0xffd2
addr a is 0xffd3
这和编译器有关系吗?
我用的是win-tc
谢谢
非常感谢

网上确实有说和编译器有关,对齐也是编译器用来提高效率的 具体的也不是很清楚


恰恰相反,和编译器无关。
是和总线对内存的访问方式有关。
请…
[/Quote]

当然是和编译器有关的,就是因为编译器配置了是32位的平台,所以才会有这种对齐方式!否则怎么解释同样是x86,tc和vc的结果不一样!
linux_and_unix 2008-07-05
  • 打赏
  • 举报
回复
我用visual c/c++调试结果是
addr c is 0x12ff63
addr a is 0x12ff57
pengzhixi 2008-07-05
  • 打赏
  • 举报
回复
与编译器有关哦,DEV是一个字节的距离
weiyijiji 2008-07-05
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 fuqd273 的回复:]
引用 14 楼 lyle3 的回复:
肯定和编译器有关呀,自己也能设置..
引用 13 楼 weiyijiji 的回复:
引用 8 楼 Jerrylearnc 的回复:
为什么我运行了一下
显示的是
addr c is 0xffd2
addr a is 0xffd3
这和编译器有关系吗?
我用的是win-tc
谢谢
非常感谢

网上确实有说和编译器有关,对齐也是编译器用来提高效率的 具体的也不是很清楚


恰恰相反,和编译器无关。
是和总线对内存的访问方式有关。
请…
[/Quote]
不甚明白 还请赐教
fuqd273 2008-07-04
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 lyle3 的回复:]
肯定和编译器有关呀,自己也能设置..
引用 13 楼 weiyijiji 的回复:
引用 8 楼 Jerrylearnc 的回复:
为什么我运行了一下
显示的是
addr c is 0xffd2
addr a is 0xffd3
这和编译器有关系吗?
我用的是win-tc
谢谢
非常感谢

网上确实有说和编译器有关,对齐也是编译器用来提高效率的 具体的也不是很清楚
[/Quote]

恰恰相反,和编译器无关。
是和总线对内存的访问方式有关。
请回忆一下虚拟内存的偏移寻址方式。
4或者8的倍数是为了更快的访问内存,从而提高效率。
K行天下 2008-07-04
  • 打赏
  • 举报
回复
使用
Tc; Dev C++; Code::Blocks都是差一字节,
使用VC四字节



aozhi 2008-07-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 artman 的回复:]
32位系统不特别制定变量地址以4的整数开头.
[/Quote]

这样从内存中读数据效率最高。
prettyboy923 2008-07-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xkyx_cn 的回复:]
C/C++ code
// 差了4个字节,确实是为了对齐,提高内存读写操作的效率
addr c is 0x12ff7c
addr a is 0x12ff78
[/Quote]
aozhi 2008-07-03
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 weiyijiji 的回复:]
引用 16 楼 aozhi 的回复:
引用 12 楼 weiyijiji 的回复:
引用 7 楼 aozhi 的回复:
引用 2 楼 artman 的回复:
32位系统不特别制定变量地址以4的整数开头.


这样从内存中读数据效率最高。

能具体说下原因么?谢谢

寄存器是32位的,把数据一下子读到EAX里根据变量类型判断取多少字节,剩下的就扔掉。这样岂不是比起判断剩下的数据位还是否有用要省事的多?虽然有点浪费空间。

那先判断类型在放到寄存器不也…
[/Quote]
那就要计算一下LDRB的时钟周期了。
fuqd273 2008-07-03
  • 打赏
  • 举报
回复
除非你指定倍数,否则指针值只能是4或者8的整数倍。
32位编译的话,指针值是4的整数倍。
64位编译的话,指针值是8的整数倍。
VC6编译选项里面可以指定。
xkyx_cn 2008-07-03
  • 打赏
  • 举报
回复

// 差了4个字节,确实是为了对齐,提高内存读写操作的效率
addr c is 0x12ff7c
addr a is 0x12ff78
liyinlei 2008-07-03
  • 打赏
  • 举报
回复
vs2003等默认是 4个字节对齐
artman 2008-07-03
  • 打赏
  • 举报
回复
32位系统不特别制定变量地址以4的整数开头.
liyinlei 2008-07-03
  • 打赏
  • 举报
回复
地址有什么问题吗?
c, a 分配在栈上,地址从高到低
GoAssemblyNow 2008-07-03
  • 打赏
  • 举报
回复
我的是Dev-C++的,一个字节。
Thirty 2008-07-03
  • 打赏
  • 举报
回复
学些~~~~~~~~~
  • 打赏
  • 举报
回复
学习了o(∩_∩)o...
加载更多回复(13)

69,371

社区成员

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

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