#pragma pack(n)和__attribute__((aligned(m)))的区别
来源:互联网 发布:理性知乎 编辑:程序博客网 时间:2024/06/06 08:30
前 者告诉编译器结构体或类内部的成员变量相对于第一个变量的地址的偏移量的对齐方式,缺省情况下,编译器按照自然边界对齐,当变量所需的自然对齐边界比n大 时,按照n对齐,否则按照自然边界对齐;后者告诉编译器一个结构体或者类或者联合或者一个类型的变量(对象)分配地址空间时的地址对齐方式。也就是所,如 果将__attribute__((aligned(m)))作用于一个类型,那么该类型的变量在分配地址空间时,其存放的地址一定按照m字节对齐(m必 须是2的幂次方)。并且其占用的空间,即大小,也是m的整数倍,以保证在申请连续存储空间的时候,每一个元素的地址也是按照m字节对齐。 __attribute__((aligned(m)))也可以作用于一个单独的变量。举例说明:
#include<stdio.h>#pragma pack(4)typedef struct{uint32_t f1;uint8_t f2;uint8_t f3;uint32_t f4;uint64_t f5;}__attribute__((aligned(1024))) ts;int main(){printf("Struct size is: %d, aligned on 1024\n",sizeof(ts));printf("Allocate f1 on address: 0x%x\n",&(((ts*)0)->f1));printf("Allocate f2 on address: 0x%x\n",&(((ts*)0)->f2));printf("Allocate f3 on address: 0x%x\n",&(((ts*)0)->f3));printf("Allocate f4 on address: 0x%x\n",&(((ts*)0)->f4));printf("Allocate f5 on address: 0x%x\n",&(((ts*)0)->f5));return 0;}输出:
Struct size is: 1024, aligned on 1024
Allocate f1 on address: 0x0
Allocate f2 on address: 0x4
Allocate f3 on address: 0x5
Allocate f4 on address: 0x8
Allocate f5 on address: 0xc
注意
绿色部分表明了__attribute__((aligned(1024))) 的作用
红色部分说明#pragma pack(4)只对大小大于4的成员变量的地址偏移起作用
紫色部分说明对于大小大于4的成员变量,其地址偏移按照4字节对齐
转载:#pragma pack(n)和__attribute__((aligned(m)))的区别
0 0
- #pragma pack(n)和__attribute__((aligned(m)))的区别:
- #pragma pack(n)和__attribute__((aligned(m)))的区别
- #pragma pack(n)和__attribute__((aligned(m)))的区别
- #pragma pack(n)和__attribute__((aligned(m)))的区别
- #pragma pack(n)和__attribute__((aligned(m)))的区别
- #pragma pack(n)和__attribute__((aligned(m)))的区别
- #pragma pack(n)和__attribute__((aligned(m)))的区别
- C/C++开发--#pragma pack(n)和__attribute__((aligned(m)))的区别
- #pragma pack() 和 __attribute__((aligned())) 区
- vc下和gcc的结构体紧凑对齐格式存储【#pragma pack(push,1)、__attribute__ ((packed, aligned(1)))】
- #pragma pack(n) 与 __attribute(aligned(n))
- GCC 对 #pragma pack(N)和__attribute__((packed)) 的支持问题
- __attribute((aligned(n)))与#pragma pack (n)详解
- 细说 #pragma pack(n)*** #pragma pack(push,1)与#pragma pack(1)的区别
- #Pragma Pack(n)与内存分配 pragma pack(push,1)与#pragma pack(1)的区别
- __attribute__ ((aligned (n), packed))
- __attribute__ ((aligned (n), packed))
- __attribute__ ((aligned (n), packed))
- Android网络通信
- draw9patch使用原则
- the network adapter could not establish the connection的解决方法
- windows8.1 快速使用指南(英文原版 + 中文翻译版txt)
- html5的Input Type : Range,大家都知道这个是怎么样的吗?
- #pragma pack(n)和__attribute__((aligned(m)))的区别
- Codeforces Round #185 (Div. 1) / 311A The Closest Pair (“陷阱”题)
- POJ3273 Monthly Expense
- java.jse--jvm--JVM内存管理和JVM垃圾回收机制
- php截取中文字符串长度的mb_substr()、mb_strcut()函数,自定义实现中文字符串无乱码方法
- Delphi与C#互操作之Hydra
- 第十章 菜单和其他资源
- hadoop随记
- 如何添加Support Library