__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

智能推荐

双硬盘安装win10+ubuntu18.04双系统,U盘安装,UEFI引导_supercolar的博客-程序员宝宝_双硬盘安装ubuntu双系统

之前写过一篇《最详细移动硬盘安装linux过程,装在移动硬盘上的linux系统不能在另一台电脑启动的解决办法》,有比较具体的U盘安装Linux系统的方法,这里就写的简略些,记录一些问题和需要注意的地方。我的笔记本是宏基暗影骑士,双硬盘,128G的固态已经装了win10了。我要做的是在1T的机械硬盘上安装ubuntu18.04 bionic。在安装前,首先还是用disk genius对机械盘...

ffmpeg-Android的编译以及使用_ck_19900710的博客-程序员宝宝

ffmpeg能做什么不再赘述,并且ffmpeg功能之强大,几乎所有和音视频有关的东西都能做编译环境:Ubuntu 16.04 64位ffmpeg-3.0.5 fdkaac-0.1.5libx264-20161204  android-ndk-r10dffmpeg下载地址:http://www.ffmpeg.org/download.html

Asp.Net Core Mvc上Json序列化首字母大小写的问题_weixin_33697898的博客-程序员宝宝

在mvc中返回Json格式数据,用Return Json()时,序列化后的Json串首字母全变成了小写。第一种解决方案用 return Json(new { code = 0, msg = "", count = datas.Count, data = datas }); public IServiceProvider ConfigureServices(IServi...

EMGU.CV入门(十五、模板匹配)_LyRics1996的博客-程序员宝宝_emgucv 模板匹配如何判断评分

一、函数介绍1.1 MatchTemplate模板匹配函数参数说明参数1:输入图像参数2:匹配模板参数3:返回矩阵参数4:算法类型其中算法类型共计六种: // // 摘要: // This function is similiar to cvCalcBackProjectPatch. It slids through image, // compares overlapped patches of size

Vhost Architecture(基于kernel3.10.0 & qemu2.0.0)_leoufung的博客-程序员宝宝_vhost_virtqueue_mask

在前面的文章中在介绍virtio机制中,可以看到在通常的应用中一般使用QEMU用户态程序来模拟I/O访问,而Guest中的数据要通过Guest到Host Userspace的第一次拷贝,再经过Host userspace到Host Kernel的第二次拷贝,这种多次的数据拷贝和CPU特权级的切换对性能有相当大的影响。为加速virtio设备的I/O性能,VHOST通过driver的形式在Host K

element Steps 含状态步骤条及单步执行事件处理_YYDataV数据可视化的博客-程序员宝宝_element steps

引导用户按照流程完成任务的分步导航条,可根据实际应用场景设定步骤,步骤不得少于 2 步。每一步骤显示出该步骤的状态。 JS 代码

随便推点

为什么wait/notify/notifyAll被定义在Object类中,而sleep定义在Thread类中,wait/notify和sleep方法的异同_都是底层的博客-程序员宝宝

为什么wait/notify/notifyAll被定义在Object类中,而sleep定义在Thread类中因为java中每个对象都有一把称之为monitor监控器的锁由于每个对象都可以上锁,这就要求在对象头中有一个用来保存锁信息的位置这个锁是对象级别多大,而非线程级别的,wait/notify/notifyAll也都是锁级别的操作,他们的锁属于对象所以把他们定义在Object类中最合适,因为Objecct类是所有对象的父类因为如果把wait/notify/notifyAll方法定义在Thre

Kerberos的白银票据详解_weixin_30532987的博客-程序员宝宝

0x01白银票据(Silver Tickets)定义 白银票据(Silver Tickets)是伪造Kerberos票证授予服务(TGS)的票也称为服务票据。如下图所示,与域控制器没有AS-REQ 和 AS-REP(步骤1和2),也没有TGS-REQ / TGS-REP(步骤3和4)通信。由于银票是伪造的TGS,所以没有与域控制器通信。0x02白银票据的特点1.白银票据...

学习笔记2:Pytorch 神经网络初始化权重与偏置_只想飘一飘的博客-程序员宝宝_pytorch 神经网络自动更新权重与偏量

学习笔记2:Pytorch 神经网络初始化权重与偏置**class CONCAT_CNN(nn.Module): def __init__(self): super(CONCAT_CNN, self).__init__() self.conv1_1 = nn.Conv2d(1, 64, kernel_size=3, stride=1, padding=1) def forward(self, x): conv1_1 = F.relu

JT/T808模拟器、企业压测工具使用_lgoodbook的博客-程序员宝宝_jt/t808、809模拟、压测工具

网上能找到使用说明,但总会有一些坑,感觉很难受1. 安装mysql的msi文件2. 安装navicat3. 登录本地mysql 服务,新建数据库testmingo4.导入数据备份文件库里面大概有这些表5.新建用户 gps 、admin用户密码为[email protected]*3df)34c$3116.安装模拟终端,一路next安装好以后,如下图修改配置文件BasicConfig启动以后如上图,如果登录按钮是置灰的说明数据库没有连接上,仔细检查数据库和808服务器地址也可以在设置中配置输入a

【Android TV 开发】-->一些优秀 TV 开发相关框架 & 文章_Kevin-Dev的博客-程序员宝宝_android tv开发框架

Android TV 相关的库,包括界面开发,播放器等等的收集,我并无法保证全部加入,必定会遗漏一些优秀的 TV 相关的库。

推荐文章

热门文章

相关标签