Chinaunix首页 | 论坛 | 博客
  • 博客访问: 305548
  • 博文数量: 79
  • 博客积分: 773
  • 博客等级: 军士长
  • 技术积分: 789
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-24 23:52
个人简介

victory for prepared

文章分类

全部博文(79)

文章存档

2024年(1)

2023年(1)

2022年(2)

2021年(1)

2018年(8)

2017年(3)

2016年(20)

2015年(12)

2013年(5)

2012年(25)

2011年(1)

我的朋友

分类: C/C++

2012-03-27 11:16:31

#pragma pack()
对齐,对于这个我的猜想是这样的。操作系统会把不同数据类型的变量放在不同的内存区间。比如将int变量,全部在0x**************00这样的地址中,就可以实现所有的int变量均在地址为4的倍数的地址上了。可能在内核处理的时候可以使用较为简单的运算和便于管理吧。而对short型的地址,便是在最后几位为***0这种地址,最后一位必须为零,这样所有的short型地址,自然就是2的倍数。可能这也是对齐的由来吧。这和内存中页的管理相似,使低10位为零,来作为页的目录的地址。这样可以使用计算机中的逻辑运算便可以达到搜索,如果地址对不齐的话,将要使用算术运算来访问地址,这样的话会降低效率。下面是从msdn copy下来的程序,用于根据设备要求进行数据缓冲区的对齐,其中AlignmentMask是通过IOCTL_STORAGE_QUERY_PROPERTY命令获取的结构体STORAGE_ADAPTER_DESCRIPTOR中的。意思就是先向设备发通过deviceiocontrol函数送一个IOCTL_STORAGE_QUERY_PROPERTY命令,系统返回一个STORAGE_ADAPTER_DESCRIPTOR结构体,其中包含有AlignmentMask项,决定了对齐方式。
 
PVOID AllocateAlignedBuffer(ULONG size, ULONG AlignmentMask, PVOID *pUnAlignedBuffer)
{
    PVOID AlignedBuffer;
    ULONG_PTR FullWordMask = (ULONG_PTR)AlignmentMask;
    if (AlignmentMask == 0)
    {
        AlignedBuffer = malloc(size);
        // return the original buffer to free later
        *pUnAlignedBuffer = AlignedBuffer;
    }
    else
    {
        // expand the size for the alignment window
        size += AlignmentMask;
        AlignedBuffer = malloc(size);
        // return the original buffer to free later
        *pUnAlignedBuffer = AlignedBuffer;
        // adjust buffer pointer for the desired alignment
        AlignedBuffer = (PVOID)(((ULONG_PTR)AlignedBuffer + FullWordMask) & ~FullWordMask);
    }
    return AlignedBuffer;
}
阅读(1009) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~