结构体的数据对齐与内存对齐

  1. 1 #pragma pack(n)
  2. 2 attribute((aligned(m)))
  3. 3 示例代码

1 #pragma pack(n)

用于告诉编译器结构体或类内部的成员变量相对于第一个变量的地址的偏移量的对齐方式,缺省情况下,编译器按照自然边界对齐,当变量所需的自然对齐边界比n大 时,按照n对齐,否则按照自然边界对齐.

2 attribute((aligned(m)))

用于告诉编译器一个结构体或者类或者联合或者一个类型的变量(对象)分配地址空间时的内存地址对齐方式。

3 示例代码

#include<stdio.h>
#include<sys/types.h>

#pragma pack(push)  //保存之前的对齐状态

#pragma pack(4)     //设置4字节对齐

typedef struct{
u_int32_t v1;        // 4 Bytes
u_int8_t v2;         // 1 Bytes
u_int16_t v3;        // 2 Bytes
u_int32_t v4;        // 4 Bytes
u_int64_t v5;        // 8 Bytes
}__attribute__((aligned(1024))) Test;

#pragma pack(pop)    //恢复对齐状态

int main()
{
  printf("Size of Struct Test is: %d, aligned on 1024\n",sizeof(Test));
  printf("v1 : 0x%x\n",&(((Test*)0)->v1));
  printf("v2 : 0x%x\n",&(((Test*)0)->v2));
  printf("v3 : 0x%x\n",&(((Test*)0)->v3));
  printf("v4 : 0x%x\n",&(((Test*)0)->v4));
  printf("v5 : 0x%x\n",&(((Test*)0)->v5));

  return 0;
}

输出结果为

Size of Struct Test is: 1024, aligned on 1024
v1 : 0x0
v2 : 0x4
v3 : 0x6
v4 : 0x8
v5 : 0xc

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 add358@163.com

文章标题:结构体的数据对齐与内存对齐

文章字数:304

本文作者:Jake Yang

发布时间:2017-07-31, 00:00:00

最后更新:2019-12-16, 16:02:52

原始链接:https://add358.github.io/2017/07/31/Language-CXX-2017-07-31-结构体的数据对齐与内存对齐/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏