sizeof 和 alignment(对齐)

原创 2004年03月05日 13:41:00

sizeof 和 alignment(对齐)


1: alignment的定义
   alignment指的是对象的开始地址必须满足条件:
  
   >>#pragma pack(push, 1)
   <<任何地址

   >>#pragma pack(push, 2)
   <<偶数地址

   >>#pragma pack(push, 4)
   <<地址必须是4的倍数

   >>#pragma pack(push, 8)
   <<地址必须是8的倍数

2: 基本类型T的alignment(T)
   对齐值就是上面所说的1, 2, 4, 8

   现在对应于每个类型T, 都有一个alignment(T)和T对应,
   这个对应关系究竟如何呢:

   (以下针对我们现在所碰到的编译器而言)
  
   << char -->  1 (永远是1)

   << short
      #pragma pack(1) --> 1
      #pragma pack(2) --> 2
      #pragma pack(4) --> 2 // 呵呵,这里是关键
      ...                      --> 2

   << int
      #pragma pack(1) --> 1
      #pragma pack(2) --> 2
      #pragma pack(4) --> 4 // 呵呵,这里是关键
      ...                      --> 4
      ...
  
   这里就有了一个概念, 我们尚且将其命名为
   internal_PACK(T):
      internal_PACK(char) = 1
      internal_PACK(short) = 2
      internal_PACK(int) =4
      internal_PACK(int64) = 8
      ...
   和当前编译器的对齐方式无关。

   编译其当前设置的#pragma pack(n)值我们命名为
      PACK (= n)

   那我们就有公式:
    if (internal_PACK(T) < PACK)
      alignment(T, PACK) = internal_PACK(T)
    else
      alignment(T, PACK) = PACK

   下面的这个对任何类型T都成立:
   alignment(T) <= PACK                          --------------------------------#1

 
3  struct(or class)类型ST的alignment(ST)

   alignment(ST) = max { alignment(T) | T 是ST的data member 的类型 }

 
4  举例
   <<
      #pragma pack(1)
      struct A
      {
        ....
      };           
      由#1, 在pack(1)的情况下所有的 alignment(type)≡1

   <<
      #pragma pack(4)
      struct A
      {
         char ch;
         short sh;
      };
      alignment(ch) = 1
      alignment(sh) = 2
      alignment(A)  = 2

   <<
      #pragma pack(8)
      struct A
      {
        char ch;
        int n;
        char ch;
      };
      alignment(n) = 4
      alignment(A) = 4

   <<
      #pragma pack(2)
      struct A
      {
        char ch;
        int n;
        char ch;
      };
      alignment(n) = 2
      alignment(A) = 2

5:  sizeof(T)
    <<
      对基本类型来说 
         sizeof(T)   = internal_PACK(T)
   
    <<
      对结构类型ST来说 
      把最后一个数据成员m_last去掉后形成的结构叫ST~
      sizeof(ST) = sizeof(ST~) + last_size + patch        
      其中
   <<
             last_size = member_patch + sizeof(m_last)
             member_patch = [sizeof(ST~) 到 比它的alignment(m_last)倍数的最小距离] ;      
 
          <<
             patch     = [sizeof(ST~) + last_size到比它大的alignment(ST)倍数的最小距离]

     其中
   <<
             member_patch是因为m_last要地址对齐alignment(m_last)
         
          <<
             patch 是因为如果声明一个数组的话:
       ST st[2];
             为了满足
         1:  st[1] 地址alignment(ST)对齐
                        2:  sizeof(st) = sizeof(st1) + sizeof(st2)
             关键是第二条
             所以需要patch把余下的空间补满。
            

数据的对齐(alignment)

对齐(alignment) 数据的对齐(alignment)是指 数据的地址 和 由硬件条件决定的内存块大小 之间的关系。一个变量的地址是它大小的倍数的时候,这就叫做自然对齐 (natu...
  • wfreehorse
  • wfreehorse
  • 2017年03月16日 18:55
  • 884

硬盘用Paragon Alignment Tool不能4K对齐解决方法

本来在csdn下载这个工具,发现要7分,好吧,下了。谁知道是个坑比,没分,最后下载一个免费的,有时候免费的更好。其实这些我都知道有什么作用,只是看到网上说,其实机械硬盘4K对齐也会提高硬盘性能,并且给...
  • smile_life_
  • smile_life_
  • 2016年11月14日 01:52
  • 2997

ARM Linux中的非对齐内存访问(Alignment trap警告的原因)

介绍ARM Linux中进行编程时非对齐内存地址访问时需要注意的问题,以及Alignment trap警告的原因。...
  • jasonchen_gbd
  • jasonchen_gbd
  • 2016年06月04日 22:12
  • 3935

字节对齐导致sizeof()比实际更大

转载地址 写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧./******************...
  • JQ_AK47
  • JQ_AK47
  • 2015年06月10日 20:31
  • 780

【C++学习笔记】sizeof()的用法与字节对齐

1.32位机器和64位机器下面各类型sizeof的大小。 1) 32位机器下: Char类型: Size of charis:                            1 Size of...
  • Kevin_zhai
  • Kevin_zhai
  • 2015年09月07日 15:33
  • 3692

内存对齐 相关知识,转

1. 内存对齐(Data Structure Alignment)是什么 内存对齐,或者说字节对齐,是一个数据类型所能存放的内存地址的属性(Alignment is a property o...
  • gocy123
  • gocy123
  • 2016年08月13日 21:01
  • 325

sizeof计算结构体大小(字节对齐)

引言:sizeof计算结构体的大小经常出现在笔试题中,接下来是对它的一些总结 1.计算结构体大小的准则 数据类型 32位机大小(字节) 64位机大小(字节) char 1 1 ...
  • u011471286
  • u011471286
  • 2016年04月03日 15:06
  • 1342

人脸对齐 python代码

file4.close()   file5.close()    step5 特征点校准 从二进制文件中读取特征点位置信息 [python] view plain copy ...
  • AMDS123
  • AMDS123
  • 2017年03月23日 22:43
  • 6856

Face Alignment by 3000 FPS系列学习总结(一)

face alignment 流程图train阶段测试阶段预处理裁剪图片 tr_data = loadsamples(imgpathlistfile, 2); 说明: 本函数用于将原始图片取grou...
  • xiamentingtao
  • xiamentingtao
  • 2016年03月07日 21:14
  • 3817

c++ 类 占用内存 相关问题

问题: 若char是一字节,int是4字节,指针类型是4字节,代码如下:class CTest { public: CTest():m_chData(‘\0’),m_nDat...
  • lgfun
  • lgfun
  • 2016年07月22日 22:55
  • 236
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sizeof 和 alignment(对齐)
举报原因:
原因补充:

(最多只允许输入30个字)