__attribute__ 变量对齐

http://blog.163.com/sunm_lin/blog/static/9192142200741533038695/

一.   __attribute__ ((aligned (n)))

该属性规定变量或结构体成员的最小的对齐格式,以字节为单位。例如:
int x __attribute__ ((aligned (16))) = 0;
编译器将以16字节(注意是字节byte不是位bit)对齐的方式分配一个变量。也可以对结构体成员变量设置该属性

二、__attribute__ ((aligned))

选择针对目标机器最大的对齐方式,可以提高拷贝操作的效率

三、__attribute__ ((packed))

使用该属性可以使得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐。

四、例子

struct foo {
  char a;
  int x[4] __attribute__ ((packed));
  };//17
struct bar8{
  char a;
  int x[4] __attribute__ ((aligned(8)));
  };//24
struct bar16 {
  char a;
  int x[4] __attribute__ ((aligned(16)));
  };//32
struct bar32{  char a;  int x[4] __attribute__ ((aligned(32)));
  };//64
struct bar {
  //char a;
  char x[4] __attribute__ ((aligned));
  };
struct bar_16 {
  char a;
  int x[4] __attribute__ ((aligned));
  };
[[email protected] attribute]# ./var_attribute

sizeof(foo)=17

sizeof(bar)=16

sizeof(bar_16)=32

sizeof(bar8)=24

sizeof(bar16)=32

sizeof(bar32)=64

时间: 2024-09-29 09:48:19

__attribute__ 变量对齐的相关文章

成员变量对齐的原理

我花了一个上午,看了一些资料,总算把这个问题搞明白了.下面我以一些例子说明结构体成员变量的对齐问题. 对于 struct s1 { char a; long int d; double c; }; 这个结构体的大小是16.编译器默认的一般是8字节对齐.a的大小是1,它就按1字节对齐(因为比指定的8 小),存诸在0偏移的地方:b大小为4,它就按4字节对齐(因为比指定的8小),存在偏移4——7的位置,c大小为8,存在8——15的位置.这样3个成员共占用了16个字节.由于该结构最大成员c大小为8,所以

结构变量对齐知识

#pragmapack(push)//保存对齐状态 #pragmapack(4)//设定为4字节对齐 struct test{    char m1;    double m4;    int m3;}; #pragmapack(pop)//恢复对齐状态 原文地址:https://www.cnblogs.com/licona/p/9902291.html

gcc数据对齐之: howto 1.

GCC支持用__attribute__为变量.类型.函数.标签指定特殊属性.这些不是编程语言标准里的内容,而属于编译器对语言的扩展. 本文介绍其中的两个属性:aligned和packed. aligned aligned属性最常用在变量声明上.它的作用是告诉GCC,为变量分配内存时,要分配在对齐的内存地址上.什么是对齐的内存地址呢? 一般计算机的内存是以字节(byte,等于8bit)为最小单元的.内存地址相当于从0开始的字节偏移数.如果一个内存地址是N的倍数,我们就说它是N字节对齐的(N-byt

C语言 结构体的内存对齐问题与位域

http://blog.csdn.net/xing_hao/article/details/6678048 一.内存对齐 许多计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对 齐,而这个k则被称为该数据类型的对齐模数(alignment modulus).当一种类型S的对齐模数与另一种类型T的对齐模数的比值是大于1的整数,我们就称类型S的对齐要求比T强(严格),而称T比S弱(宽 松).这种强制的要求一来简化了处

javascript的语法,关键保留字及变量

一.语法构成: 1.区分大小写: ECMAScript 中的一切,包括变量.函数名和操作符都是区分大小写的.例如:text 和Text 表示两种不同的变量. 2.标识符: 所谓标识符,就是指变量.函数.属性的名字,或者函数的参数.标识符可以是下列格式规则组合起来的一或多个字符: 1.第一字符必须是一个字母.下划线(_)或一个美元符号($),数字不能作为开头. 2.其他字符可以是字母.下划线.美元符号或数字. 3.不能把关键字.保留字.true.false 和 null 作为标识符. 3.注释:

js基础 1.简单js 语法 关键字 保留字 变量

简单js JavaScript 是一个松散性的语言 对象属性却不想c中的结构体或者c++ 和java的对象, 对象继承机制 使用原型的prototype(原型链),js的分为三部分ECMAScript .文档DOM对象.浏览器BOM对象 1. 核心(ECMAScript) (语法.类型.语句.关键字.保留字.操作符.对象等)Ie6.7.8 第三版(ECMA-262) 兼容 2.文档对象 dom(ie6-7 基本都dom 一级(基本操作都可以),) 3.浏览器对象模型 BOM (控制浏览器显示无标

第3章 语法、关键保留字及变量

任何语言的核心都必然会描述这门语言最基本的工作原理.而JavaScript的语言核心就是ECMAScript,而目前用的最普遍的是第3版,我们就主要以这个版本来讲解. 一.语法构成 区分大小写 ECMAScript中的一切,包括变量.函数名和操作符都是区分大小写的.例如:text和Text表示两种不同的变量.   标识符 所谓标识符,就是指变量.函数.属性的名字,或者函数的参数.标识符可以是下列格式规则组合起来的一或多个字符: 1.第一字符必须是一个字母.下划线(_)或一个美元符号($). 2.

C结构体中数据的内存对齐问题

转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一般默认8字节对齐(64位机机器字长8字节) 1.先看下面的例子:struct A{   char c1;   int i;   short s;   int j;}a; struct B{   int i;   int j;     short s;   char c1;}b; 结构A没有遵守字节对

JavaScript三(语法、关键保留字及变量)

基本概念 一.区分大小写 在ECMAScript中的一切(变量.函数名.操作符)都是区分大小写的. 如变量名test和Test分别表示两个不同的变量, 二.标识符 所谓标识符,就是指变量.函数.属性的名字,或者函数的参数.标识符按照下列格式规则组合起来的一或者多个字符: 第一个字符必须为一个字母.下划线(_).或者一个美元符号($); 其它字符可以是字母.下划线.美元符号或数字. ECMAScript标识符采用驼峰大小写格式,也就是第一个字母小写,剩下的每个单词的首字母大写,例如:firstSe