__attribute__((packed))的作用

__attribute__((packed))的作用

在结构体变量的声明中,经常可以看到__attribute__((packed))修饰符。这是做什么用的呢?请看一下程序:

#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int

int main()
{
    struct {
        u16 reg;
        u32 test2;
        u8 test1;
        u8 val[256];
    } msg = {
        .reg = 0x8001,
        .test1 = 0xff,
        .test2 = 0x71727374,
        .val = {0x11, 0x12, 0x13, 0x14},
    };
    u8* ptr = (u8*) &msg;
    int i;
    for (i=0; i<0x10; i++)
        printf("%02x ", ptr[i]);
    return 0;
}

程序的输出为:

01 80 00 00 74 73 72 71 ff 11 12 13 14 00 00 00

如果在msg前加上__attribute__((packed)) ,程序变为:

#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int

int main()
{
    struct {
        u16 reg;
        u32 test2;
        u8 test1;
        u8 val[256];
    } __attribute__((packed)) msg = {
        .reg = 0x8001,
        .test1 = 0xff,
        .test2 = 0x71727374,
        .val = {0x11, 0x12, 0x13, 0x14},
    };
    u8* ptr = (u8*) &msg;
    int i;
    for (i=0; i<0x10; i++)
        printf("%02x ", ptr[i]);
    return 0;
}

程序的输出为:

01 80 74 73 72 71 ff 11 12 13 14 00 00 00 00 00

因此可以看到,packed属性修改了编译器对结构体成员的布局,尽可能压缩存储空间。默认情况下,gcc会为了效率考量,会让char或者short独占一个双字(4字节)。

gcc手册的说明:

packed
The packed attribute
specifies that a variable or structure field should have the smallest possible alignment—one byte for a variable, and one bit for a field, unless you specify a larger value with the aligned attribute.

Here is a structure in which the field x is packed, so that it immediately follows a:

          struct foo           {             char a;             int x[2] __attribute__ ((packed));           };

有时间也看看这个:
http://stackoverflow.com/questions/8568432/is-gccs-attribute-packed-pragma-pack-unsafe

__attribute__((packed))的作用,布布扣,bubuko.com

时间: 2024-12-17 12:33:24

__attribute__((packed))的作用的相关文章

__attribute__((packed))作用

1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法.这个功能是跟操作系统没关系,跟编译器有关,gcc编译器不是紧凑模式的,我在windows下,用vc的编译器也不是紧凑的,用tc的编译器就是紧凑的.例如: 在TC下:struct my{ char ch; int a;} sizeof(int)=2;sizeof(my)=3;(紧凑模式) 在GCC下:struct my{ char ch; in

__attribute__((packed)) 详解

摘自LDD3 为了编写可以在不同平台之间可移植的数据项的数据结构,除了规定特定的字节序以外,还应该始终强制数据项的自然对齐. 自然对齐(Natural Alignment)是指在数据项大小的整数倍(例如,8字节数据项存入8的整数倍的地址)的地址处存储数据项. 强制自然对齐可以防止编译器移动数据结构的字段,你应该使用填充符(filer)字段来避免在数据结构中留下空洞. 编译器本身可能会往结构体中插入填充数据,以确保每个字段的对齐可以在目标处理器上取得好的性能. 如果正在定义一个和设备要求的结构体相

Qt Creator(编译器MinGW)中使用__attribute__(packed)的问题

http://www.bttr-software.de/forum/mix_entry.php?id=11767 假设我们从串口中读到一串数据,当我们想要处理这串数据的时候通常是这样做的: 1 将这些数据拷贝到某段内存rbuf[]中: 2 将该段内存的首地址rbuf赋给一个我们已经定义好的结构体指针*wp: 3 使用该结构体指针wp按图索骥地找到我们需要的数据: 然而,事实上,事情总不会这么简单. 这里假设该内存中存放的就是一个完整的符合我们所要的格式的数据,在我们使用wp指针读数据的时候就往往

@清晰掉 GNU C __attribute__

__attribute__((packed))详解 1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法.这个功能是跟操作系统没关系,跟编译器有关,gcc编译器不是紧凑模式的,我在windows下,用vc的编译器也不是紧凑的,用tc的编译器就是紧凑的.例如: 在TC下:struct my{ char ch; int a;} sizeof(int)=2;sizeof(my)=3;(紧凑模式) 在G

Linux framebuffer显示bmp图片

framebuffer简介     帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作.framebuffer是LCD对应的一中HAL(硬件抽象层),提供抽象的,统一的接口操作,用户不必关心硬件层是怎么实施的.这些都是由Framebuffer设备驱动来完成的.     帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/d

(转)CPU Cache与内存对齐

转自:http://blog.csdn.net/zhang_shuai_2011/article/details/38119657 原文如下: 一. CacheCache一般来说,需要关心以下几个方面1)Cache hierarchyCache的层次,一般有L1, L2, L3 (L是level的意思)的cache.通常来说L1,L2是集成 在CPU里面的(可以称之为On-chip cache),而L3是放在CPU外面(可以称之为Off-chip cache).当然这个不是绝对的,不同CPU的做

Linux framebuffer显示bmp图片【转】

本文转载自:http://blog.csdn.net/luxiaoxun/article/details/7622988 framebuffer简介 帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作.framebuffer是LCD对应的一中HAL(硬件抽象层),提供抽象的,统一的接口操作,用户不必关心硬件层是怎么实施的.这些都是由Framebuffer设备驱动来完成的.     帧缓冲设备对应

提取bmp图片的颜色信息,可直接framebuffer显示

稍微了解了下linux的framebuffer,这是一种很简单的显示接口,直接写入像素信息即可 配置好的内核,会有/dev/fbn 的接口,于是想能否提前生成一个文件,比如logo.fb,里面仅包含像素信息,从而可以直接送入framebuffer显示 搜索了一下,有不少文章介绍,如何解析bmp图片并送给framebuffer显示,但没有找到预处理工具,都是直接处理完就送入framebuffer 于是参考了一篇文章,改动了下代码,将直接送入framebuffer变成写到一个文件中. 原代码地址为

转载--__attribute__ 你知多少?

作者:青春物语 链接:__attribute__ 你知多少? GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属性(Function Attribute ).变量属性(Variable Attribute )和类型属性(Type Attribute ). __attribute__ 书写特征是:__attribute__ 前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__ 参数. __attribute__