gcc数据结构对齐之:why.】的更多相关文章

gcc 支持 aligned 和 packed 属性指定数据对齐,那么在了解对齐规则之前,需要解决第一个以为,我们为什么需要数据对齐?请看下图: 相信学过汇编的朋友都很熟悉这张图,这张图就是CPU与内存如何进行数据交换的模型,其中,左边蓝色的方框是CPU,右边绿色的方框是内存,内存上面的0-3是内存地址.这里我们这张图是以32位CPU作为代表,我们都知道,32位CPU是以双字(DWORD)为单位进行数据传输的,也正因为这点,造成了另外一个问题,那么这个问题是什么呢?这个问题就是,既然32位CPU…
通过上面的分析,总结结构体对齐规则如下: 1.数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行.2.结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行.3.结合1.2颗推断:当#pragma p…
原文链接:http://www.catb.org/esr/structure-packing/ 谁应阅读本文 本文探讨如何通过手工重新打包C结构体声明,来减小内存空间占用.你需要掌握基本的C语言知识,以理解本文所讲述的内容. 如果你在内存容量受限的嵌入式系统中写程序,或者编写操作系统内核代码,就有必要了解这项技术.如果数据集巨大,应用时常逼近内存极限,这项技术会有所帮助.倘若你非常非常关心如何最大限度地减少处理器缓存段(cache-line)未命中情况的发生,这项技术也有所裨益. 最后,理解这项…
GCC支持用__attribute__为变量.类型.函数.标签指定特殊属性.这些不是编程语言标准里的内容,而属于编译器对语言的扩展. 本文介绍其中的两个属性:aligned和packed. aligned aligned属性最常用在变量声明上.它的作用是告诉GCC,为变量分配内存时,要分配在对齐的内存地址上.什么是对齐的内存地址呢? 一般计算机的内存是以字节(byte,等于8bit)为最小单元的.内存地址相当于从0开始的字节偏移数.如果一个内存地址是N的倍数,我们就说它是N字节对齐的(N-byt…
JNA全称是Java Native Access,是Sun推出的一种调用本地方法技术,比起它的同门师兄JNI,JNA大大简化了调用本地方法的过程,使用也比较方便, JNA是在JNI的基础上完善的,用青出于蓝而胜于蓝来形容一点不为过,下面看一下JNI的调用过程:   使用JNI你得完成上面这些步骤,比较麻烦,而是用JNA就省事多了,基本上不需要脱离Java环境就可以完成.     JNA项目主页是https://jna.dev.java.net/, 目前最新的版本是3.2.4 .下载时记得将自带的…
Android反编译(三) 之重签名 [目录] 1.原理 2.工具与准备工作 3.操作步骤 4.装X技巧 5.问题 1.原理 1).APK签名的要点 a.所有的应用程序都必须有数字证书 ,Android系统不会安装一个没有数字证书的应用程序: b.Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证: c.数字证书都是存在有效期的,Android只是在应用程序安装的时候才会检查证书的有效期.如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能. d.A…
本来要自己翻译的,随手搜索了一下,发现五天前已经有人翻译了,我就不重复发明轮子了. 转自:http://blog.csdn.net/yutianzuijin/article/details/26289257 前不久在微博上看到一篇很好的短文讲如何对C/C++进行性能优化,虽然其面向的领域是图形学中的光线跟踪,但是还是具有普遍的意义,将其翻译成中文,希望对大家写高质量代码有帮助. 1.     牢记阿姆达尔定律:   其中表示函数func运行时间占总时间的百分比,表示对该函数加速获得的加速比. 例…
前不久在微博上看到一篇非常好的短文讲怎样对C/C++进行性能优化,尽管其面向的领域是图形学中的光线跟踪,可是还是具有普遍的意义,将其翻译成中文,希望对大家写高质量代码有帮助. 1.     牢记阿姆达尔定律:加速比== 当中表示函数func执行时间占总时间的百分比,表示对该函数加速获得的加速比. 比如,你优化一个函数TriangleIntersect(),该函数的执行时间占总时间的40%,优化之后执行时间缩短一半,则整个代码会获得25%的性能提升. 这个公式告诉我们不经常使用的代码(比如场景载入…
一.字节对齐 现代计算机的内存空间是按照字节(byte)来划分的,字节对齐的意思是在给特定变量类型分配内存空间的时候,变量的内存地址是它本身变量类型大小的整数倍.比如,给int类型的变量a分配地址空间,因为int类型大小为4字节,所以它的内存地址一定也要是4的整数倍. 即:给变量的地址(起始地址)为它自身类型大小的整数倍. 原因:硬件.cpu存取效率 内存对齐: 在32位系统下,gcc的对齐方式为1,2,4,默认为4字节对齐.  在64为系统下,gcc的对齐方式为1,2,4,8,默认为8字节对齐…
目录 Android NDK笔记 AOSP Android repository Android SDK / SDK Tools NDK cmake && ninja lldb adb / fastboot: 都在platform-tools 实例:ubuntu命令行安装android sdk/ndk/cmake/lldb jni的两种构建方式 一些小细节 使用clang替代gcc 字节对齐 Android NDK笔记 AOSP Android Open Source Project,简称…