新手问:内存对齐方式

大狗狗 2008-11-12 06:56:15
[StructLayout(LayoutKind.Sequential, Pack=2)]
public struct authseed
{
public UInt32 Index;
public UInt32 reslet;
public UInt16 nLen;
public Int64 p;
public Int64 q;
public Int64 r;
}

这是一位网友的代码,Pack=2意思是指结构体按2字节对齐?如果是的话,按两字节对齐显然不够吧,现在主流32位系统,起码应指定4吧?看结构里有64位数据,我认为是不是指定8比较合适?

请大家发表意见!
...全文
557 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hotneo2002 2008-11-13
  • 打赏
  • 举报
回复
学习
大狗狗 2008-11-13
  • 打赏
  • 举报
回复
如果我采用8字节对齐,那么除了结构可能会稍多占些空间外,没有别的坏处吧?关键是这样可确保访问速度快。
good-code 2008-11-12
  • 打赏
  • 举报
回复
许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus)。当一种类型S的对齐模数与另一种类型T的对齐模数的比值是大于1的整数,我们就称类型S的对齐要求比T强(严格),而称T比S弱(宽松)。这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度。比如这么一种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能保证double类型的数据都从8倍数地址开始,那么读或写一个double类型数据就只需要一次内存操作。否则,我们就可能需要两次内存操作才能完成这个动作,因为数据或许恰好横跨在两个符合对齐要求的8字节内存块上。某些处理器在数据不满足对齐要求的情况下可能会出错,但是Intel的IA32架构的处理器则不管数据是否对齐都能正确工作。不过Intel奉劝大家,如果想提升性能,那么所有的程序数据都应该尽可能地对齐。Win32平台下的微软C编译器(cl.exe for 80x86)在默认情况下采用如下的对齐规则: 任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。Linux下的GCC奉行的是另外一套规则(在资料中查得,并未验证,如错误请指正):任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。
aimeast 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hhhh63 的回复:]
一般的编译器都默认4字节对齐,效率比较高。

这个结构设为两字节对齐应该有特殊的意义:

1. 和16位操作系统兼容。
2. 保存为文件后格式比较通用,好多程序没有对齐的概念,便于其它程序读取。
[/Quote]
学习了
hhhh63 2008-11-12
  • 打赏
  • 举报
回复
一般的编译器都默认4字节对齐,效率比较高。

这个结构设为两字节对齐应该有特殊的意义:

1. 和16位操作系统兼容。
2. 保存为文件后格式比较通用,好多程序没有对齐的概念,便于其它程序读取。
smallxu 2008-11-12
  • 打赏
  • 举报
回复
对。够。大致可以这样理解类型长度小于2的补齐 ,大于2的补齐2的倍数!
大狗狗 2008-11-12
  • 打赏
  • 举报
回复
怎么没人回复?再顶
大狗狗 2008-11-12
  • 打赏
  • 举报
回复
up

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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