关于C/C++语言字节对齐

关于C/C++语言字节对齐

数据类型

char

short

int

long

float

double

long double

gcc3.2.2

1

2

4

4

4

8

12

Visual C++

1

2

4

4

4

8

8

 
共用体变量的所占字节数为最大数据类型成员的大小,例如 union Union { int i,char  ch}; Union test; 则test  的大小为4(int类型的大小)。
 
枚举类型变量大小为4字节。  
 
结构体类型变量的大小问题是一些公司招聘的时候很受青睐的题目。在谭的书中没有涉及到这个问题,严格的说这是个跟编译器字节对齐关系挺大的问题。为了使CPU对变量的进行快速高效的访问,变量的起始地址应该满足某些特性,即所谓的对齐。关于字节对齐有两个重要的宏,#pragma pack (n)和#pragma pack 第一个宏是强制编译器一般以n的倍数进行地址对齐(还有特殊情况以小于n的字节数进行对齐),第二个宏结束前面设置的对齐方式,恢复到编译器默认的对齐方式。在Visual C++下默认的字节对齐数为8。
 
结构体中的变量item在结构体中相对于首地址的偏移量应该是 X 的倍数,X 由如下式子确定:X=min(n,sizeof(item)),举个例子(设n为8):struct Test { char c1; char c2; int i};  如果定义了变量Test  t ,那么在存储 t 的 i 时 X 就应该是min(8,sizeof(int))即为4的倍数,即 i 相对于结构体首地址的偏移量必须是4的倍数,所以 t 的大小就应该为8字节(在c1和c2后填充了两个字节以满足前述条件)。对于struct { char c1; char c2}不会出现填充的的情况,每个成员相对首地址的偏移量也满足是X的倍数(此时X为1),其大小为2字节。
  
还有一种特殊情况,就是空结构体。在Visual C++下其大小为1,即struct{}类型的变量在VC下输出其大小是1,解释就是VC为每个结构体变量分配一个字节的内存,以使该变量有个地址;而在gcc下输出其大小为0,我的理解是既然此结构体一个成员都没有,程序中就不会访问它,因此也不必分配内存,如果编译器碰到有访问此结构体成员的情况就会报错。
 
仔细分析以下程序
#include <iostream.h>
struct t1{
    char a;
    int b;
    char c;
};
struct t2{
    char a;
    char b;
    int c;
};
struct t3{
    char a;
    double b;
    int c;
};
struct t4 {
    short a[3];
    long b;
    char c;
};
struct t5{
    int a;
    t4 b;
    char c;
};
struct t6{
    char c;
    int a;
    t3 b;
};
int main()
{
    t1 a1;
    t2 a2;
    t3 a3;
    t4 a4;
    t5 a5;
    t6 a6;
    cout<<sizeof(a1)<<endl;//12
    cout<<sizeof(a2)<<endl;//8
    cout<<sizeof(a3)<<endl;//24
    cout<<sizeof(a4)<<endl;//16
    cout<<sizeof(a5)<<endl;//24
    cout<<sizeof(a6)<<endl;//32
    return 0;
}
 
如果是类的对象的话,请分析下面程序
#include <iostream.h>
 
class CA
{
public:
        CA(){
           a = 0;
           c = 'a';
        }
         ~CA(){}
private:
char c;
         int a;
static int b;   //存储在静态存储区内
         double d;
};
int CA::b = 8;
int main()
{
    CA cc;
    cout<<sizeof(cc)<<endl;   //16
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值