结构体内存布局`alignof`
发布日期:2021-05-08 04:53:58 浏览次数:20 分类:精选文章

本文共 1200 字,大约阅读时间需要 4 分钟。

首先看看下面这个程序输出

#include 
#include
#include
typedef uint32_t MYSIZE;struct Node{ char *Data;// 1 --- 指针变量,如果在64位操作系统上,占用8byte struct Node *Next;// 2 --- 同样是指针变量,如果在64位操作系统上,占用8byte MYSIZE Size;// 3 --- uint32_t 32位uint占用4byte MYSIZE Pos;// 4 --- uint32_t 32位uint占用4byte};int main() { printf("alignof struct Node: %d\n", alignof(struct Node)); printf("struct sizeof Node: %d\n", sizeof(struct Node)); return 0;}

output:

alignof struct Node: 8struct sizeof Node: 24

计算一个struct大小对依据就是 alignof 的大小。一句话就是结构体的内存布局根据 alignof 的长度进行对齐布局的。为了便于说明,将上面程序中结构体Node中的4个变量编号:

  1. Data
  2. Next
  3. Size
  4. Pos

结下来使用编号来表示内存布局:

1 1 1 1 1 1 1 1 // 长度82 2 2 2 2 2 2 2 // 长度83 3 3 3 4 4 4 4 // 长度4 加 长度4

这里是以长度8对齐的,即alignof 为8,struct node 的总长度为24,合理解释来程序输出。

下面调整一下结构体,将3提到2前面,看看程序布局会发生什么变化。

struct Node{    char *Data;// 1 --- 指针变量,如果在64位操作系统上,占用8byte    MYSIZE Size;// 3 --- uint32_t 32位uint占用4byte    struct Node *Next;// 2 --- 同样是指针变量,如果在64位操作系统上,占用8byte    MYSIZE Pos;// 4 --- uint32_t 32位uint占用4byte};

程序输出output:

alignof struct Node: 8struct sizeof Node: 32

为什么结构体的大小会变大为32呢?

看看下面的结构布局:

1 1 1 1 1 1 1 13 3 3 32 2 2 2 2 2 2 24 4 4 4

按照alignof=8进行对齐布局,只能是这么一个情况。所以,结构体大小就变成来32。

上一篇:C++小实验--组装电脑
下一篇:C++Dynamic_Array(vector)实现

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年03月29日 22时11分17秒