字节对齐

字节对齐就是数据在内存中的位置。

假设一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比方在32位cpu下。假设一个整型变量的地址为0x00000004,那它就是自然对齐的。

字节对齐的必要性

须要字节对齐的根本原因在于CPU訪问数据的效率问题。假如整型变量的地址不是自然对齐。比方为0x00000002,则CPU假设取它的值的话须要訪问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据。假设变量在0x00000003地址上的话则要訪问三次内存,第一次为char,第二次为short,第三次为char,然后组合得到整型数据。

而假设变量在自然对齐位置上,则仅仅要一次就能够取出数据。

字节对齐的规则

对于标准数据类型,它的地址仅仅要是它的长度的整数倍即可了。而非标准数据类型按以下的原则对齐:

 

1. 数组 :依照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。

2. 联合 :按其包括的长度最大的数据类型对齐。

3. 结构体: 结构体中每一个数据类型都要对齐。

样例

struct stu{
   char sex;
   int length;
   char name[10];
  };

这个里面sex是1个字节,然后遇到length的时候,须要在sex后加入3个空字节,由于length占4个字节,而在name占10个字节之后,变为18个字节,并不正确齐,所以添两个空字节。变为20个字节。

改变对齐方法

__attribute__选项

这个是改变对齐方法的,例如以下样例:

struct stu{
   char sex;
   int length;
   char name[10];
  }__attribute__ ((aligned (1)));

这个是一共变成了15个字节,由于aligned改变了自然对齐字节为1个字节。

所以总体缩小了。

相同以下的声明:

struct stu{
   char sex;
   int length;
   char name[10];
  }__attribute__ ((packed));

这个也是15个字节。packed让结构体使用最小的对齐方式。

必须声明对齐

在设计不同CPU的通信协议时。或者编写硬件驱动程序时寄存器的结构这两个地方都须要按一字节对齐。即使看起来本来就自然对齐的也要使其对齐,以免不同的编译器生成的代码不一样.

C语言学习 - 字节对齐的更多相关文章

  1. 转载:C语言的字节对齐及#pragma pack的使用

    C语言的字节对齐及#pragma pack的使用   C编译器的缺省字节对齐方式(自然对界) 在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间. 在结构中,编译器为结构的每个成员 ...

  2. C语言之字节对齐

    在C语言编程中,有时为了达到减少运行的时间的目的,需要浪费一些空间:而有时为了节省空间,使它的运行时间增长.而字节对齐则是为了访问效率,用空间换取时间. 要掌握字节对齐,首先得明确一下四个概念: 1. ...

  3. 【C语言】字节对齐(内存对齐)

    数据对齐 1.  对齐原则: [原则1]数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma p ...

  4. 【C语言】字节对齐问题(以32位系统为例)

    1. 什么是对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型 ...

  5. C语言:内存字节对齐详解[转载]

    一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...

  6. C语言:内存字节对齐详解

    转:http://blog.csdn.net/arethe/article/details/2548867 一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论 ...

  7. C语言中内存对齐方式

    一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...

  8. <摘录>字节对齐(强制对齐以及自然对齐)

    struct {}node; 32为的x86,window下VC下sizeof(node)的值为1,而linux的gcc下值为0: 一.WINDOWS下(VC--其实GCC和其原理基本一样,象这种问题 ...

  9. C语言深入学习系列 - 字节对齐&内存管理

    用C语言写程序时需要知道是大端模式还是小端模式. 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中:所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高 ...

随机推荐

  1. BZOJ2465: [中山市选2009]小球

    Description        给定n个不同颜色的球,每个球都有一个分数,同时有m个瓶子,每个瓶子都有固定的容量.现在,你必须把球放到瓶子里面.请编程计算最多能放多少个球到这些瓶子里. Inpu ...

  2. SetProcessWorkingSetSize 降低程序运行内存

    在项目中对程序性能优化时,发现用SetProcessWorkingSetSize() 方法使内存降低了很多,于是查阅了相关的资料如下. 一 SetProcessWorkingSetSize 的工作原理 ...

  3. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array 带权并查集

    C. Destroying Array 题目连接: http://codeforces.com/contest/722/problem/C Description You are given an a ...

  4. c# dapper mysql like 参数化

    //拼接sql语句: if (!string.IsNullOrEmpty(model.Email)) { where += " and a.email like @email "; ...

  5. 应用通信-方案一:RestTemplate

    @RestController public class ClientController { @Autowired private LoadBalancerClient loadBalancerCl ...

  6. STM32 F4 ADC DMA Temperature Sensor

    STM32 F4 ADC DMA Temperature Sensor Goal: detecting temperature variations using a temperature senso ...

  7. Jquery中使用定时器setInterval和setTimeout

    直接在ready中调用其他方法,会提示缺少对象的错误,解决方法如下: 方法1. 函数不在$(function(){....})内,setInterval第一个参数为"showAtuto&qu ...

  8. 理解 process.initgroups(user, extra_group)

    这个函数是对 linux  C函数 initgroups()  的包装 node.js 官方文档非常含糊,还是看 linux C函数文档的解释!非常清楚明确. The initgroups() fun ...

  9. SpringMVC介绍之视图解析器ViewResolver

    在前一篇博客中讲了SpringMVC的Controller控制器,在这篇博客中将接着介绍一下SpringMVC视图解析器.当我们对SpringMVC控制的资源发起请求时,这些请求都会被SpringMV ...

  10. Html学习笔记3

    1表格的标题和表头: <table> <caption>成绩单</caption> <tr> <th>姓名</th> <t ...