首页 > 其他分享 >c语言之被遗漏的角落---#pragma pack

c语言之被遗漏的角落---#pragma pack

时间:2023-02-11 16:23:13浏览次数:39  
标签:PS int 地址 pragma 对齐 ---# pack

PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,

如果和你的原则及想法相冲突,请谅解,勿喷。

前置说明

  本文作为本人csdn blog的主站的备份。(BlogID=016)
  本文发布于 2016-05-15 17:21:34,现用MarkDown+图床做备份更新。blog原图已丢失,使用csdn所存的图进行更新。(BlogID=016)

环境说明

  无

前言


  前述:懒人一个,闲的无聊。上网,偶然发现一个C相关的东西(可见本人的相关文章)。在深入学习的时候,就遇到了这个#PRAGMA PACK([pop push n ......]),让我不得其解。

  大家都知道,在我们写一个c的程序的时候,其实其他语言的程序一样,都是由SourceCode-->目标代码-->可执行文件。这中间有许多的东西(细节,默认的属性==)都被一个东西给屏蔽了--------那就是编译器与链接器。

  编译器与链接器的作用:

  • 首先翻译
  • 其次分析
  • 最后生成可执行文件。

  这里由于不讲编译器的一些常见的知识,如语法树,字符流,词法语法分析,我们讲讲我们没有关注的东西,我们程序中的变量,过程的逻辑地址的分配问题。逻辑地址,起始地址都是由0开始的。那么我们的其他地址的逻辑地址呢?这里除了过程段的地址,还有变量的地址问题。我们今天就来看看变量地址的问题。

  据我说知,c语言对变量内存的大小划分是以int类型的大小为标准的。在32bit下,int为4bytes。这个就是一个对齐的一个很重要的参考。内存地址对齐是很重要的。优点,可以提升访问速度,降低设计难度。缺点,可能在一些情况下会浪费内存。

  在编译器中(对于32bit机器),对齐默认为4bytes,那如果你想改变这个对齐大小(至于为何会改,除了关于结构体的一些计算要用之外,由于作者水平有限,其他方面我就不知道了。)





pragma pack()


#pragma pack()就是来调整你的代码在编译的时候,对齐的问题。

例子:假如是16位平台,char 为一个字节,int为2字节大小。

#pragma pack(push)

#pragma pack(2)



typedef struct{

char a;

int b;

} test;



#pragma pack(pop)



xxx.c文件:

test mmm;

int d = &mmm.a-&mmm.b



求d的值,你算出来了吗?如果你有自己的想法了,那么你就对#pragma pack 有了一定的理解。




后记


  无

参考文献

  无




打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
qrc_img

PS: 请尊重原创,不喜勿喷。

PS: 要转载请注明出处,本人版权所有。

PS: 有问题请留言,看到后我会第一时间回复。

标签:PS,int,地址,pragma,对齐,---#,pack
From: https://www.cnblogs.com/Iflyinsky/p/17111902.html

相关文章

  • Nginx服务器---安装与启动
    遇到需要使用Nginx服务器的案例,简单记录一下整个过程。 整体过程:1.https://nginx.org/en/download.htmlNginx官方安装地址Mainlineversion(主流版)Stableversion(稳......
  • 编译OpenWRT-for-MT7620A(带8021x验证)
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文作为本人csdnblog的主站的备份。(BlogID......
  • [POI2011]MET-Meteors 解题报告
    语言系统紊乱了QAQ这道题感觉不是很难鸭qwq。先只考虑一个国家,怎么做?很显然,就直接二分一下就行了。判定答案可以维护一个差分数组,然后最后对它做一个前缀和,再求一下这......
  • 旅游线路收藏-前台代码、收藏次数动态展示
    前台代码 route_detail类(function(){//发送请求,判断用户是否收藏过该路线varrid=getParamter("rid");$.g......
  • 在Ubuntu14.04上安装qt5和qtcreator的 两种方式(源代码和xxxxx.run) 和我的感悟-------
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。前置说明  本文发布于2014-07-2512:21:13,现用MarkDo......
  • 83、商城业务---购物车---购物车vo编写
    这两个vo比较独特,我们重写了它的get/set方法,对他的属性进行了计算。packagecom.gulimall.cart.vo;importjava.math.BigDecimal;importjava.util.List;/***整个......
  • 神经网络基础部件-BN层详解
    一,数学基础1.1,概率密度函数随机变量(randomvariable)是可以随机地取不同值的变量。随机变量可以是离散的或者连续的。简单起见,本文用大写字母$X$表示随机变量,小写字母$x......
  • 面试题--mysql的数据库优化
    mysql的数据库优化 当有人问你如何对数据库进行优化时,很多人第一反应想到的就是SQL优化,如何创建索引,如何改写SQL,他们把数据库优化与SQL优化划上了等号。当然这不......
  • Qt-Qt之监听窗口改变事件(最小化、最大化、还原)
    相关资料:https://blog.csdn.net/weixin_43165135/article/details/125527497实例代码:.pro1QT+=coregui23greaterThan(QT_MAJOR_VERSION,4):QT+......
  • Redis实战-session共享之修改登录拦截器
    在上一篇中Redis实战之session共享,我们知道了通过Redis实现session共享了,那么token怎么续命呢?怎么刷新用户呢?本来咱们就通过拦截器来实现这两个功能。登录拦截器优化:凯哥......