大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
#pragma pack规定的对齐长度,实际使用的规则是:
结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
也就是说,当#pragma pack的值等于或超过所有数据成员长度的时候,这个值的大小将不产生任何效果。
而结构整体的对齐,则按照结构体中最大的数据成员 和 #pragma pack指定值 之间,较小的那个进行。

#pragma pack(push,1)
struct My    //1字节对齐
{
    
char c;
    
int i;
    
char cc;
}
;
#pragma pack(push,
2)
struct My1    //2字节对齐
{
    
char c;
    
int i;
    
char cc;
}
;
#pragma pack(pop)



int main()
{
    cout
<<sizeof(My)<<endl;        //6
    cout<<sizeof(My1)<<endl;    //8

    
return 0;    
}


#include "stdafx.h"
#include 
<iostream>

using namespace std;

//1)  如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;  
//2)  如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;  
//3)  如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;  
//4)  如果位域字段之间穿插着非位域字段,则不进行压缩;  
//5)  整个结构体的总大小为最宽基本类型成员大小的整数倍。 

void f(char a[])
{
    cout
<<sizeof(a)<<endl;            //4        size of pointer
}


struct sa {
    
char ba:3;
    
char bc:3;
    
char bd:3;
    
char be:3;
    
char bf:3;     //15 bit
    char c;         //1 byte
    int bb:5;     //4 byte
}
;

struct sc {
    
char c;
}
;

class A {
    
int i;
    
char c;
    
char d;
public:
    
void FunA(){}
}
;

class B{
    
int i;
    
char c;
public:
    
virtual void FunB(){}
    
virtual void FunBB(){}
}
;

class C {

}
;

int main ()
{
    cout
<<sizeof(sa)<<endl;            //4+4=8        size of struct    最小单位:4字节
    cout<<sizeof(sc)<<endl;            //1        

    cout
<<sizeof(int)<<endl;        //4        size of int
    cout<<sizeof(double)<<endl;        //8        size of double
    cout<<sizeof(char)<<endl;        //1        size of char
    cout<<sizeof(float)<<endl;        //4        size of float
    cout<<sizeof(long)<<endl;        //4        size of long
    cout<<sizeof(void*)<<endl;        //4        size of pointer

    
char a[7]={0};
    f(a);    
    cout
<<sizeof(a)<<endl;            //7        size of array

    cout
<<sizeof(A)<<endl;            //8        4+1+1    最小单位:4字节

    cout
<<sizeof(B)<<endl;            //12    4+1+4(VPTR)

    cout
<<sizeof(C)<<endl;            //1        非零长度

    
return 0;    
}
;
posted on 2009-06-22 14:08 大胖 阅读(226) 评论(0)  编辑 收藏 引用 所属分类: Others

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理