__attribute__ ((aligned (n), packed))_mrwangwang的博客-程序员宝宝

技术标签: c 语言相关  

下记转载:
http://chentravel.blogspot.com/2007/11/attribute.html

GNU C扩展的__attribute__ 机制被用来设置函数、变量、类型的属性,其用得较多的是处理字节对齐的问题。

__attribute__ 的语法为:
__attribute__ ((语法列表))

参数aligned(number) [number为最小对齐的字节数]是用得较多的一个。
另一个是参数packed 表示“使用最小对齐”方式,即对变量是字节对齐,对于域是位对齐。

这个例子稍长了点,不过非常简单:
[[email protected] develop]# cat align.c
 

#include <stdio.h>
struct A{
  char a;          //1Byte
  int b;           //4B
  unsigned short c;//2B
  long d;          //4B
  unsigned long long e; //8B
  char f;               //1B
};

struct B{
  char a;
  int b;
  unsigned short c;
  long d;
  unsigned long long e;
  char f;
}__attribute__((aligned));

struct C{
  char a;
  int b;
  unsigned short c;
  long d;
  unsigned long long e;
  char f;
}__attribute__((aligned(1)));


struct D{
  char a;
  int b;
  unsigned short c;
  long d;
  unsigned long long e;
  char f;
}__attribute__((aligned(4)));

struct E{
  char a;
  int b;
  unsigned short c;
  long d;
  unsigned long long e;
  char f;
}__attribute__((aligned(8)));

struct F{
  char a;
  int b;
  unsigned short c;
  long d;
  unsigned long long e;
  char f;
}__attribute__((packed));

int main(int argc, char **argv){
  printf("A = %d, B = %d, C = %d, D = %d, E = %d, F = %d\n",
  sizeof(struct A), sizeof(struct B), sizeof(struct C), sizeof(struct D), sizeof(struct E), sizeof(struct F));
  return 0;
}

 


在一个 32位机 上运行结果如下:

[Copy to clipboard] [ - ]CODE:
[[email protected] develop]# gcc -o align align.c
[[email protected] develop]# ./align
A = 28, B = 32, C = 28, D = 28, E = 32, F = 20
[[email protected] develop]#

我们看到

最后一个struct F,1 + 4 + 2 + 4 + 8 + 1 = 20,因为使用了__attribute__((packed));
来表示以最小方式对齐,所以结果刚好为20。

而第一个struct A,因为什么也没有跟,采用默认处理方式:4(1) + 4 + 4(2) + 4 + 8 + 4(1) = 28,括号中是其成员本来的大小。与此相似的是struct D。

接下来看struct E,采用8个字节的方式来对齐:8(1+4+2 ,即a, b, c)+ 8(4, d) + 8 + 8(1, f) = 32。

而在struct C中,试图使用__attribute__((aligned(1))) 来使用1个字节方式的对齐,不过并未如愿,仍然采用了默认4个字节的对齐方式。

在struct B中,aligned没有参数,表示“让编译器根据目标机制采用最大最有益的方式对齐"——当然,最有益应该是运行效率最高吧,呵呵。其结果是与struct E相同。

下接:数据对齐
http://blog.chinaunix.net/u3/98822/showart.php?id=2335795

原文见:http://blog.chinaunix.net/uid-21830881-id-1813965.html

IEEE、万方文献及国内外专利下载,请关注微信公众号IEEE

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mrwangwang/article/details/8935487

智能推荐

NYOJ 118 修路方案(次小生成树)_briup_acmer的博客-程序员宝宝

修路方案时间限制:3000 ms  |  内存限制:65535 KB难度:5描述南将军率领着许多部队,它们分别驻扎在N个不同的城市里,这些城市分别编号1~N,由于交通不太便利,南将军准备修路。现在已经知道哪些城市之间可以修路,如果修路,花费是多少。现在,军师小工已经找到了一种修路的方案,能够使各个城市都联通起来,而且花费最少。但是,南

linux 冒号转义字符,linux常用转义字符_寂寞孩纸的博客-程序员宝宝

反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。单引号(''):转义其中所有的变量为单纯的字符串。双引号(""):保留其中的变量属性,不进行转义处理。反引号(``):把其中的命令执行后返回结果。先定义一个名为PRICE的变量并赋值为5,然后输出以双引号括起来的字符串与变量信息:[[email protected] ~]# PRICE=5[[email protected] ~]# echo "Price is $PRICE...

linux 冒号的用途_kankan_summer的博客-程序员宝宝

本文链接:http://codingstandards.iteye.com/blog/1160298   (转载请注明出处) 用途说明我们知道,在Linux系统中,冒号(:)常用来做路径的分隔符(PATH),数据字段的分隔符(/etc/passwd)等。其实,冒号(:)在Bash中也是一个内建命令,它啥也不做,是个空命令、只起到占一个位置的作用,但有时候确实需要它。当然,它

报错:org.springframework.http.converter.json.MappingJacksonHttpMessageConverter_weixin_30292843的博客-程序员宝宝

org.springframework.http.converter.json.MappingJacksonHttpMessageConverter1、错误描述严重: Servlet /huxs threw load() exceptionjava.lang.ClassNotFoundException: org.springframework.http.con...

tomcat配置url跳转_一个 tomcat 下如何部署多个项目?附详细步骤_weixin_40000702的博客-程序员宝宝

一个tomcat下如何部署多个项目?Linux跟windows系统下的步骤都差不多,以下linux系统下部署为例。windows系统下部署同理。 1不修改端口,部署多个项目清楚tomcat目录结构的应该都知道,项目包是放在webapps目录下的,那能否在同一个tomcat的webapps目录下运行多个不同项目呢?答案是可以的。1、将多个项目包放入webapps文件夹下2、修改conf下的serve...

随便推点

Android10 (.kl)按键布局文件的解析过程分析_永暮十三的博客-程序员宝宝_android 解析kl

.kl文件的加载过程分析.kl文件简述示例EventHub::openDeviceLockedKeyMap::loadKeyMap::probeKeyMapKeyMap::getPathgetInputDeviceConfigurationFilePathByDeviceIdentifiergetInputDeviceConfigurationFilePathByNameappendInputDeviceConfigurationFileRelativePathKeyLayoutMap::loadKeyLa

Zigbee无线传感网 CC2530+DHT11&DS18B20 温湿度采集 串口上位机显示_Link2Points的博客-程序员宝宝_zigbee怎么无线连接上位机

文章目录一、介绍二、上位机数据采集(一)采集数据(二)拓扑结构(三)新节点加入网络(四)节点事件三、实现分析(一)配置文件(二)发送(三)短地址和数据获取(四)数据包分析(五)上位机四、IAR一、介绍硬件:4块CC2530模块,2个DS18B20温度传感器、1个DHT11传感器、一个抽水器(可无)。软件:基于C#开发上位机(.NET Framework 4.8)、ZStack-2.5.1a协议栈。由协调器及各节点组建星型网,采用点播通讯(P2P),结合上位机的限制最多可以接入6个终端节点。硬件_1671465600

SpringMVC使用<mvc:default-servlet-handler/>可以访问静态资源,但是导致Controller访问失败_wu9333的博客-程序员宝宝

参考文章地址 http://blog.csdn.net/j080624/article/details/66969987如果在web.xml 拦截配置如下: SpringMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spri

基于OPC规范的客户应用程序实现(转载文章)_hoohooplay的博客-程序员宝宝

  基于OPC规范的客户应用程序实现石林锁,王涛,刘顺波(第二炮兵工程学院机电工程系,陕西西安 710025)摘要:介绍了过程控制领域中引进的一种新技术-OPC数据访问标准,论述了OPC相关概念、基础及OPC标准接口,并以OPC数据访问定制接口规范(1.0A)为蓝本,给出了利用Visual C++实现OPC客户应用程序的详细步骤。关键词:过程控制;OPC规范;接口;客户应用中图分类号:TP

mysql8.0 sql_mode操作_诸葛老刘的博客-程序员宝宝_mysql8 sql_mode

文章目录前置条件:问题及其解决方案:前置条件:mysql版本: 8.0安装方法: docker安装使用状态: PC本地可以远程连接docker 安装mysql:8.0 , docker 安装mysql:5.7 问题及其解决方案:1 date数据类型 不能置为0000-00-00 00:00:00已尝试方案:mysql5.7的sql_mode操作, 未能解决问题通过各种...

Linux 命令_weixin_33827965的博客-程序员宝宝

◆ 安装和登录命令:login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last;◆ 文件处理命令:file、mkdir、grep、dd、find、mv、ls、diff、cat、ln;◆ 系统管理相关命令:df、top、free、quota、at、lp、adduser、groupadd、kill、crontab;◆ 网络操...

推荐文章

热门文章

相关标签