新手问:内存对齐方式

大狗狗 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比较合适?

请大家发表意见!
...全文
495 8 打赏 收藏 转发到动态 举报
写回复
用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
前言 第1章文件结构 1.1 版权和版本的声明 1.2 头文件的结构 1.3 定义文件的结构 1.4 头文件的作用 1.5 目录结构 第2章程序的版式 2.1 空行 2.2 代码行 2.3 代码行内的空格 2.4 对齐 2.5 长行拆分 2.6 修饰符的位置 2.7 注释 2.8 类的版式 第3章命名规则 3.1 共性规则 3.2 简单的Windows应用程序命名规则 3.3 简单的Unix应用程序命名规则 第4章表达式和基本语句 4.1 运算符的优先级 4.2 复合表达式 4.3 if 语句 4.4 循环语句的效率 4.5 for 语句的循环控制变量 4.6 switch语句 4.7 goto语句 第5章常量 5.1 为什么需要常量 5.2 const 与 #define的比较 5.3 常量定义规则 5.4 类中的常量 第6章函数设计 6.1 参数的规则 6.2 返回值的规则 6.3 函数内部实现的规则 6.4 其它建议 6.5 使用断言 6.6 引用与指针的比较 第7章内存管理 7.1内存分配方式 7.2常见的内存错误及其对策 7.3指针与数组的对比 7.4指针参数是如何传递内存的? 7.5 free和delete把指针怎么啦? 7.6 动态内存会被自动释放吗? 7.7 杜绝“野指针” 7.8 有了malloc/free为什么还要new/delete ? 7.9 内存耗尽怎么办? 7.10 malloc/free 的使用要点 7.11 new/delete 的使用要点 7.12 一些心得体会 第8章 C++函数的高级特性 8.1 函数重载的概念 8.2 成员函数的重载、覆盖与隐藏 8.3 参数的缺省值 8.4 运算符重载 8.5 函数内联 8.6 一些心得体会 第9章类的构造函数、析构函数与赋值函数 9.1 构造函数与析构函数的起源 9.2 构造函数的初始化表 9.3 构造和析构的次序 9.4 示例:类String的构造函数与析构函数 9.5 不要轻视拷贝构造函数与赋值函数 9.6 示例:类String的拷贝构造函数与赋值函数 9.7 偷懒的办法处理拷贝构造函数与赋值函数 9.8 如何在派生类中实现类的基本函数 9.9 一些心得体会 第10章类的继承与组合 10.1 继承 10.2 组合 第11章其它编程经验 11.1 使用const提高函数的健壮性 11.2 提高程序的效率 11.3 一些有益的建议 参考文献 附录A :C++/C代码审查表 附录B :C++/C试题 附录C :C++/C试题的答案与评分标准 前言

110,580

社区成员

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

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

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