内存对齐

czcwzw 2009-08-25 09:29:20
1.最近在看lcc源代码.有些内存对齐的不太明白,

static union { int x; char endian; } little = { 1 };

这里endian是字节序,就是"小序在前"或"大序在前"的意思,而联合体里面还定义了一个x
但是x都没用到,我猜定义x是为了内存对齐,让char endian在内存中的地址是4的整数倍,我知道
有些数如果不对齐的话可能要取2次才能从内存中取到寄存器,比如int类型的数,但是char类型是一个字节
的,无论对不对齐好像都只需要取一次,这里为什么要这样?

2.我看到源代码中在申请内存的时候比如用malloc,他申请的内存都是4K或者10k之类的,请问这样申请会
比较高效吗,如果是3k或9k不行吗?
...全文
288 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyh_baoding 2009-09-07
  • 打赏
  • 举报
回复
很有必要,对系统的执行大有好处
czcwzw 2009-09-07
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 xylicon 的回复:]
引用 24 楼 gordon3000 的回复:


不可以,endian 总是1了。



可以吧,这个跟联合体里面的元素的位置无关的啊。1是int型,优先赋给x的。
[/Quote]
不可以,我试过了,1是赋值给char的
副组长 2009-08-30
  • 打赏
  • 举报
回复
回25楼,引错了,不好意思。
副组长 2009-08-30
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 gordon3000 的回复:]
引用 22 楼 xylicon 的回复:
引用 18 楼 czcwzw 的回复:
如果改成
static union {char endian; int x;} little = { 1 };
可以吗

可以

不可以,endian 总是1了。

[/Quote]
哦?是这样?这个还真不知道。
xylicon 2009-08-30
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 gordon3000 的回复:]


不可以,endian 总是1了。

[/Quote]

可以吧,这个跟联合体里面的元素的位置无关的啊。1是int型,优先赋给x的。
副组长 2009-08-30
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 xylicon 的回复:]
引用 18 楼 czcwzw 的回复:
如果改成
static union {char endian; int x;} little = { 1 };
可以吗


可以
[/Quote]

不可以,endian 总是1了。
副组长 2009-08-30
  • 打赏
  • 举报
回复
10楼正确。
这个联合的使用与对齐无关,也根本不是为了对齐才这样写。
给它赋一个1以后,如果是小端,endian就是1,否则就是0。


static union { short x; char endian; } little = { 1 };

这样写也能达到作者的目的。


xylicon 2009-08-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 czcwzw 的回复:]
如果改成
static union {char endian; int x;} little = { 1 };
可以吗
[/Quote]

可以
flyskytoday 2009-08-26
  • 打赏
  • 举报
回复
这个帖子真是学习了,技术含量很高呀

以前看代码只是一带而过,没有象楼主这么爱思考~~
wxf54318 2009-08-26
  • 打赏
  • 举报
回复
内存对齐就是数据存放的内存区域的首地址能被数据长度整除,放数据尽量先放占用空间大的,在放小的
czcwzw 2009-08-26
  • 打赏
  • 举报
回复
如果改成
static union {char endian; int x;} little = { 1 };
可以吗
czcwzw 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 conry 的回复:]
1 这个是利用union的内存特性判断当前cpu类型的,到底是大头还是小头,
  小头的话01 00 00 00,那么endian就等于1,
  大头的话00 00 00 01,那么endian等于0
[/Quote]

static union { int x; char endian; } little = { 1 };

这里的1是赋值给x吗?
xylicon 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 czcwzw 的回复:]
很多人没有理解我的意思,
他大可以直接定义 char endian=1;
但是他没有,而是
static union { int x; char endian; } little = { 1 }
而x根本没用到,为什么?

目前比较支持2楼的解释
[/Quote]

因为用联合体可以使得内存共享。

如果你直接定义 char endian=1; 那么endian永远为1,无论是big endian 还是 little endian。
这样就不能判断到是big 还是 little endian了

但如果你用uninon,就像10楼所说的那样,可以判断是big endian 还是 little endian了。


[Quote=引用 10 楼 conry 的回复:]
1 这个是利用union的内存特性判断当前cpu类型的,到底是大头还是小头, 
  小头的话01 00 00 00,那么endian就等于1,
  大头的话00 00 00 01,那么endian等于0
[/Quote]
czcwzw 2009-08-26
  • 打赏
  • 举报
回复
UP
jyh_baoding 2009-08-26
  • 打赏
  • 举报
回复
是这样的,这是比较规范的操作
czcwzw 2009-08-25
  • 打赏
  • 举报
回复
我觉得6楼对结构体的理解有误.
这里有个帖子:
http://dev.csdn.net/article/48/48195.shtm
supertyk 2009-08-25
  • 打赏
  • 举报
回复
首先,Little Endian和Big Endian与字节对齐没有关系,一般的,X86机器上面用的都是LittleEndian的编码方式,Power PC上面用的是BigEndian编码方式。网络传输过程中使用的都是Big Endian编码方式,所以在做网络通信的时候需要考虑到这方面的问题,还有就是嵌入式的跨平台程序,也需要考虑这方面的问题,容易造成解码错误。
其次,内存的对齐问题是跟本机的字长相关的,32位机的字长是4字节,所以默认的对齐长度是4,嵌入式的系统,比较常见的字长是2字节,所以默认的对齐长度是2;内存对齐可以在代码内部控制,一般的默认的对齐长度跟同结构的最长变量相等。
不同的平台和编译器差异很大,一般的都是具体问题具体分析了,如果开发的是本机程序就不用考虑这方面的问题了
tikycc2 2009-08-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 conry 的回复:]
1 这个是利用union的内存特性判断当前cpu类型的,到底是大头还是小头, 
  小头的话01 00 00 00,那么endian就等于1,
  大头的话00 00 00 01,那么endian等于0
[/Quote]

支持 ,帮顶!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Conry 2009-08-25
  • 打赏
  • 举报
回复
1 这个是利用union的内存特性判断当前cpu类型的,到底是大头还是小头,
小头的话01 00 00 00,那么endian就等于1,
大头的话00 00 00 01,那么endian等于0
做鸡真好吃 2009-08-25
  • 打赏
  • 举报
回复
jf
加载更多回复(9)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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