sizeof的用法与字节对齐

一、sizeof是什么?

  sizeof是一种预编译处理,不是函数,不是一元表达式。也即,作用阶段在编译期。

二、功能是什么?

  sizeof返回变量或类型的字节数。

三、调用方式

  sizeof(object):对对象使用
  sizeof(typename):对类型使用

四、返回值情况归类

  其实质是考察各个类型所占内存的相关知识

  基本数据类型:
    char(unsigned) 1
    short(unsigned) 2
    int(unsigned) long float 4
    double 8
  函数:
    返回值的类型
  指针:
    32位系统 4
    64位系统 8
  数组:
    数组的实际大小

五、重点:对齐问题下的sizeof
  各类型对界与其字节数一致。也即起始地址需要被对界整除。
  另外,对于复合数据类型,如union、struct、class,类型字节数是成员最大对界的整数倍。

  sizeof(union)
    基本大小由最大的元素决定,但最终大小为最大对界的整数倍
    

union u1
{
    double a;
    int b;
}; // 8

union u2
{
    char a[13];
    char b;
}; // 13

union u3
{
    char a[13];
    int b;
}; // 16,int类型的对界为4

  sizeof(class)
    包含虚函数的类,保存了指向虚函数表的指针,而一个指针为4个字节。

  sizeof(struct) 略微复杂
    struct类型的对界为成员中的最大对界,也即struct类型的字节数是对界的整数倍,同时起始地址也是对界的整数倍。

struct nalign
{
    //基本成员类型
    char a; //起始地址:0 占空空间:1
    int b; //起始地址:4 占用空间:4
    short c; //起始地址:8 占用空间:2
    //总空间为10
    //struct为4对界 总空间补全到12
};

struct nalign1
{
    //struct类型作为成员的情形
    //
    char a; //对界:1 起始地址:0 占用空间:1
    nalign b; //对界:4 起始地址:4 占用空间 12
    //总空间为16
    //struct为对界4 总空间补全到16
};

int main(int argc, char **argv)
{
    cout << sizeof(nalign) << endl; // 输出"12"
    cout << sizeof(nalign1) << endl; //输出"16"
}

  总结:
    在复合类型中,成员变量的对界为成员起始地址的整数倍;复合类型的对界为成员变量的最大对界;复合类型的大小为其对界的整数倍。

原文地址:https://www.cnblogs.com/zjgtan/p/3834783.html