技术文

c内存字节对齐(4.3更新)

2016-03-11  本文已影响162人  AwesomeAshe

4.3:新增class的相关内容


今天看到一个题目:

字节对齐

最开始简单的理解为,每个数据的size之和就是偏移量。因为偏移量为8是因为两个int数据的大小。
但这只是巧合,理解存在错误。因为我尝试了一下这样:

#include <iostream>

struct mystruct
{
    char x;
    int y;
    int z;
};

int main()
{
    mystruct* ptr;
    ptr = NULL;
    int offsets_x = (int)(&(ptr->x));
    int offsets_y = (int)(&(ptr->y));
    int offsets_z = (int)(&(ptr->z));
    std::cout << offsets_x<<" "<<offsets_y<<" "<<offsets_z;
}

按上面的想法得到的应该是0,1,5,however,得到的是0,4,8
改成这样的话:

struct mystruct
{
    char x;
    char y;
    int z;
};

得到的是0,1,4
我直接蒙逼了。。

但如果都是char类型的话,就是0,1,2

这样得到的也是0,4,8

struct mystruct
{
    char x;
    int y;
    char z;
};

我感觉这个里面有一些什么rules。。
于是google了,发现了之前一直没思考过的问题:

字节对齐

看四个重要的基本概念:
1,数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double型为8字节。
2, 结构体或类的自身对齐值:其成员中自身对齐值最大的那个值。
3, 指定对齐值:#pragma pack (value)时的指定对齐值value。
4, 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小者,即有效对齐值=min{自身对齐值,当前指定的pack值。
基于上面这些值,就可以方便地讨论具体数据结构的成员和其自身的对齐方式。

有效对齐N表示“对齐在N上”,即该数据的“存放起始地址%N=0”。而数据结构中的数据变量都是按定义的先后顺序存放。第一个数据变量的起始地址就是数据结构的起始地址。
结构体的成员变量要对齐存放
结构体本身也要根据自身的有效对齐值圆整(即结构体成员变量占用总长度为结构体有效对齐值的整数倍)

理解 结构体的成员变量要对齐存放

理解 结构体本身也要根据自身的有效对齐值圆整

上面的概念非常便于理解,不过个人还是更喜欢下面的对齐准则。
结构体字节对齐的细节和具体编译器实现相关,但一般而言满足三个准则:

对于以上规则的说明如下:

感谢http://www.cnblogs.com/clover-toeic/p/3853132.html

与class相关:

那么问题来了,一个class里面还有成员函数什么的呢?

首先,一个class的大小包括:

不包括:

注意:

size:

上一篇 下一篇

猜你喜欢

热点阅读