__attribute__((packed)) 详解

摘自LDD3

为了编写可以在不同平台之间可移植的数据项的数据结构,除了规定特定的字节序以外,还应该始终强制数据项的自然对齐。
自然对齐(Natural Alignment)是指在数据项大小的整数倍(例如,8字节数据项存入8的整数倍的地址)的地址处存储数据项。
强制自然对齐可以防止编译器移动数据结构的字段,你应该使用填充符(filer)字段来避免在数据结构中留下空洞。

编译器本身可能会往结构体中插入填充数据,以确保每个字段的对齐可以在目标处理器上取得好的性能。
如果正在定义一个和设备要求的结构体相匹配的结构体,这种自动填充会破坏你的意图。解决的办法是告诉编译器结构体必须是“填满的”,不能添加填充符。
就是在结构体声明的地方加上__attribute__((packed)),例如:

struct {
    u16 id;
    u64 lun;
    u16 reserved1;
    u32 reserved2;
} __attribute__ ((packed)) scsi;

如果没有__attribute__((packed)),lun字段前面会被插入两个填充字节,按4字节对齐。

__attribute__((packed)) 详解

时间: 2024-08-05 14:44:22

__attribute__((packed)) 详解的相关文章

__attribute__ 详解

From http://hi.baidu.com/cygnusnow/blog/item/8b82000f871fcf2f6159f3de.html GNU C的一大特色(却不被初学者所知)就是__attribute__机制.__attribute__可以设置函数属性(Function     Attribute).变量属性(Variable Attribute)和类型属性(Type Attribute).__attribute__书写特征是:__attribute__前后都有两个下划线,并切后

[转]Redis内部数据结构详解-sds

本文是<Redis内部数据结构详解>系列的第二篇,讲述Redis中使用最多的一个基础数据结构:sds. 不管在哪门编程语言当中,字符串都几乎是使用最多的数据结构.sds正是在Redis中被广泛使用的字符串结构,它的全称是Simple Dynamic String.与其它语言环境中出现的字符串相比,它具有如下显著的特点: 可动态扩展内存.sds表示的字符串其内容可以修改,也可以追加.在很多语言中字符串会分为mutable和immutable两种,显然sds属于mutable类型的. 二进制安全(

Protocol Buffer技术详解(语言规范)

Protocol Buffer技术详解(语言规范) 该系列Blog的内容主体主要源自于Protocol Buffer的官方文档,而代码示例则抽取于当前正在开发的一个公司内部项目的Demo.这样做的目的主要在于不仅可以保持Google文档的良好风格和系统性,同时再结合一些比较实用和通用的用例,这样就更加便于公司内部的培训,以及和广大网友的技术交流.需要说明的是,Blog的内容并非line by line的翻译,其中包含一些经验性总结,与此同时,对于一些不是非常常用的功能并未予以说明,有兴趣的开发者

Protocol Buffers编码详解,例子,图解

本文不是让你掌握protobuf的使用,而是以超级细致的例子的方式分析protobuf的编码设计.通过此文你可以了解protobuf的数据压缩能力来自什么地方,版本兼容如何做到的,其Key-Value编码的设计思路.如果你详细了解此文,你应该就能具备自己造一套编解码轮子的能力(至少基本思路). 测试的例子 阅读图片时请对比前面的例子和表格.每个字段的名称都是包含了tag的. message S2 { optional int32 s2_1 = 1; optional string s2_2 =

PHP扩展代码结构详解

PHP扩展代码结构详解: 这个是继:使用ext_skel和phpize构建php5扩展  内容 (拆分出来) Zend_API:深入_PHP_内核:http://cn2.php.net/manual/zh/internals2.ze1.php 我们使用ext_skel创建扩展 hello_module,该模块包含一个方法:hello_world. 使用ext_skel 生成的代码都是PHP_开头的宏, 而不是ZEND_开头. 实际上这两者是一样的. 在源代码src/main/PHP.h 中发现:

node源码详解(五) —— 在main函数之前 —— js和C++的边界,process.binding

声明:转载请保留声明头部并标明转载.并私信告知作者.原文:http://www.cnblogs.com/papertree/p/5295344.html 在上一篇博客(详解四)讲了 C++通过v8的Object类和FunctionTemplate类,创建对象.方法,设置属性.原型方法等,提供给运行时的 js代码调用. 那么这些C++实现的process对象.TCP类是否都在程序启动的时候就创建到 js的执行环境(context)呢? 不全是.process对象是(见5.2节),但 TCP类等C+

Fnt字体格式详解

cocos2d里的数字和符号基本都会用到fnt字体, 从直观的使用来说, fnt就是讲我们熟悉和0123和图片绑定起来, 在使用0123时, 直接用图片代替, 当然这个图片不可能是矢量图, 所以在游戏中就要尽量避免对fnt字体的缩放操作, 因为对mac下fnt生成软件实在是用得不爽, 于是想写一个TexturePacker的插件, 自己实现fnt格式导出, 其中fnt文件的内容详解如下, 备忘: 第一行是对字体的介绍. info face="华康海报体W12(P)" size=32 b

linux-2.6.26内核中ARM中断实现详解(转)

转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJRaD 作者:刘洪涛,华清远见嵌入式学院金牌讲师,ARM ATC授权培训讲师. 看了一些网络上关于linux中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也想再补充自己对一些问题的理解.先从函数注册引出问题吧. 一.中断注册方法 在linux内核中用于申请中断的函数是req

block 实现原理详解(一)

对于大多数人来讲,block内部到底是怎样实现的呢?我们可以借助clang将其编译成为c++的代码,就可以看出,block到底是什么东西, 先来看这样一个问题, int age = 10; void (^block)() = ^{ NSLog(@"%d",age); }; age = 30; block();//10 以及下面的这一段代码 __block int age = 10; void (^block)() = ^{ NSLog(@"%d",age); };