自对齐(self-aligned)
C语言是自对齐的,32位以4字节对齐,64位以8字节对齐(1字节=8 bits)
自对齐的好处:在一条指令内完成数据的取或者存的操作,使得内存访问更快;否则,如果一个变量跨机器字存储,那么要做两次或更多次的访问(先取存在前一个机器字的内容,再取存在后一个机器字的内容)。
对齐要求:
- 字符可以起始于任何字节地址
- 2字节的short int必须起始于偶数地址
- 4字节的int或者float必须起始于被4整除的地址
- 8字节的long int或者double必须起始于被8整除的地址
- struct按照最宽成员进行指针对齐。如果struct中嵌套struct,外部struct要按照自己与内部struct中最宽的成员进行对齐。
内存中的实际存储情况:
例1:代码
char *p;
char c;
int x;
内存中的存储
char *p; //4 bytes(32位)或8 bytes(64位)
char c; //1 byte
char pad[]; //3 bytes,无用空间,老派术语称之为slop(水坑)
int x; // 4 bytes
消除水坑
可以通过改变变量声明的位置挤掉水坑。
水坑发生于大数据类型的存储区域紧跟在一个较小的数据类型的存储区域之后。
消除水坑的方法是按对齐的降序来对变量进行声明。
自对齐(self-aligned)的更多相关文章
- GNU C字节对齐__attribute__((aligned(n))) #pragma pack(n)
在阅读gnu软件c源代码时,经常会遇到字节对齐相关操作,比如uboot命令相关的代码中,会遇到__attribute__((aligned(n)))扩展关键字,#pragma pack(n)预处理指令 ...
- [工作积累] GCC 4.6 new[] operator内存对齐的BUG
对于用户没有定义dctor(包括其所有成员)的类来说, new CLASS[n] 可能会直接请求sizeof(CLASS)*n的空间. 而带有dctor的 类, 因为delete[]的时候要逐个调用析 ...
- __attribute__系列之aligned
__attribute__的属性aligned,作用是为了设置字节对齐. aligned是对 变量和结构体进行 字节对齐的属性设置. 通过aligned属性设置(aligned(对齐字节数)),可以显 ...
- 数据对齐 posix_memalign 函数详解
对齐 数 据的对齐(alignment)是指数据的地址和由硬件条件决定的内存块大小之间的关系.一个变量的地址是它大小的倍数的时候,这就叫做自然对齐 (naturally aligned).例如,对于一 ...
- Sword 计算机内存对齐
内存对齐理论 a.数据的对齐(alignment) 指数据的地址和由硬件条件决定的内存块大小之间的关系.一个变量的地址是它大小的倍数的时候,这就叫做自然对齐(naturally aligned). 例 ...
- gcc数据对齐之: howto 1.
GCC支持用__attribute__为变量.类型.函数.标签指定特殊属性.这些不是编程语言标准里的内容,而属于编译器对语言的扩展. 本文介绍其中的两个属性:aligned和packed. align ...
- arm的字节对齐问题总结(转)
问题由来:pc的lsb总是0,因为代码至少要字对齐.cm3的指令至少是半字对齐的(16) 一.啥是字对齐?为啥要字对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访 ...
- 可以使用Markdown了?
园子果然领先 1.标题类 一级标题 二级标题 三级标题 四级 六级 怎么可以用#号?上传上去看看 2.换行 第一行 换一行 在换一行 3.多个下划线 the_odd_egg odd 斜体用星号 4.删 ...
- 专家解读Linux操作系统内核中的GCC特性
专家解读Linux操作系统内核中的GCC特性 Linux内核使用GNU Compiler Collection (GCC)套件的几个特殊功能.这些功能包括提供快捷方式和简化以及向编译器提供优化提示 ...
- 从linux内核中学到的编程技巧 【转】
从linux内核中学到的编程技巧 分类: LINUX 1构建泛型宏 (./linux/include/linux/kernel.h) #define min(x, y) ({ \ typeof(x ...
随机推荐
- Dell PowerEdge R630服务器VMware ESXI6.0服务器安装
一.Raid 磁阵划分 官方说明:http://www.dell.com/support/article/cn/zh/cndhs1/SLN292050/%E6%88%B4%E5%B0%94%E6%9C ...
- centos 装iptraf查看网络流量
今天在测试服务器上准备看下网络流量 [root@localhost ~]# iptraf -d eth0-bash: iptraf: command not found 发现运维同事没有给安装 只能自 ...
- HTML5中对于网络是否断开的检测.很有意思哦
//事件的封装 var EventUtil = { addHandler: function (element, type, handler) {//注册事件 if (element.addEvent ...
- C# Atomic<T> Generic
using System; using System.Threading; /// <summary> /// Provides lock-free atomic read/write u ...
- mysql更新(四) 数据类型
07-数据类型 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考链接:http://www.runoob.com/mysql/m ...
- PyCharm License Activation激活码失效问题的解决方法
自己的小Python项目好几天没有写了,今天打开PyCharm准备继续写,突然发现之前的激活码被取消不能用了,本来激情满满的准备干活啦!之前搜的这个激活码本来说的是可以用到18年1月份的呢,哎…心情是 ...
- selenium+python自动化97--unittest参数化(paramunittest)
前言 paramunittest是unittest实现参数化的一个专门的模块,可以传入多组参数,自动生成多个用例 前面讲数据驱动的时候,用ddt可以解决多组数据传入,自动生成多个测试用例.本篇继续介绍 ...
- uva-10004-俩色图验证
题意: 在1976年,四色猜想被一个计算机助手提出,这个理论表示对任意一个地图的上色都只需要四种颜色,地图内每一个区块和相邻的区块颜色都不相同.你现在被要求解决一个相似但相对简单的问题.给你任意一个连 ...
- python学习中的第一个例子
搭建python 先学习下当小白鼠 1 看下自己的python版本 python -v 2 然后,用pip安装开发Web App需要的第三方库: 异步框架aiohttp: pip3 install a ...
- OpenACC 书上的范例代码(Jacobi 迭代),part 1
▶ 使用Jacobi 迭代求泊松方程的数值解 ● 原始串行版本,运行时间 2272 ms #include <stdio.h> #include <stdlib.h> #inc ...