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 有了一定的理解。

后记


  无

参考文献

  无


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

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

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

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

c语言之被遗漏的角落---#pragma pack的更多相关文章

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

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

  2. C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)

    转载地址 : http://blog.csdn.net/21aspnet/article/details/6729724 一.概念    对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它 ...

  3. C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)【转】

    转自:https://www.cnblogs.com/ransn/p/5081198.html 转载地址 : http://blog.csdn.net/21aspnet/article/details ...

  4. pragma pack(字节对齐用法)---C语言

    #pragma pack(4) typedef struct { char buf[3]; word a; }kk; #pragma pack() 对齐的原则是min(sizeof(word ),4) ...

  5. 关于pragma pack的用法(一)

    一个很重要的参数#pragma pack(n) 数据边界对齐方式:以如下结构为例: struct {                    char a;                    WOR ...

  6. #pragma pack(push,1)与#pragma pack(1)的区别

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对 ...

  7. #pragma pack(n)

    #pragma pack(n) 重要规则: 1,复杂类型中各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个类型的地址相同: 2,每个成员分别对齐,即每个成员按自己的方式对齐,并最小 ...

  8. warning malformed '#pragma pack(push[, id], n)' - ignored

    bmp.c:8: warning: malformed '#pragma pack(push[, id], <n>)' - ignored bmp.c:33: warning: #prag ...

  9. C++编译指令#pragma pack的配对使用

    #pragma pack可以用来指定C++数据结构的成员变量的内存对齐数值(可选值为1,2,4,8,16). 本文主要是强调在你的头文件中使用pack指令要配对使用,以避免意外影响项目中其他源文件的结 ...

  10. (转载)关于#pragma pack(push,1)和#pragma pack(1)

    转载http://www.rosoo.net/a/201203/15889.html 一.#pragma pack(push,1)与#pragma pack(1)的区别 这是给编译器用的参数设置,有关 ...

随机推荐

  1. Github开源项目Excalidraw:简洁易用的手绘风格白板工具

    Excalidraw是Github上的一个开源项目,它提供了一个简洁易用的手绘图形创建工具,用户可以通过它创建流程图.示意图.架构图和其他各种图形.本文将介绍Excalidraw的特点和功能,并探讨其 ...

  2. JS Leetcode 525. 连续数组 前缀和加哈希表,小白式讲解让你彻底明白此题

    壹 ❀ 引 题目来自LeetCode的525. 连续数组,难度中等,题目描述如下: 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度. 示例 1 ...

  3. Thinkpad笔记本指点杆(小红点)自动漂移的问题

    Dell, HP, Thinkpad在高端商务机上会配备指点杆(小红点), 有很多人是指点杆的忠实用户, 因为工作时可以双手不离键盘, 非常方便. 在指点杆的使用过程中, 有时候会遇到指点杆自己漂移的 ...

  4. 为什么华为今年疯狂招od?

    不知道的大家有没有发现 这两年市场不好公司用人需求紧缩 唯有华子疯狂招人 很多人都听过华为OD 但是具体是什么还是有很多人疑惑 总结以下三个部分: 1.为啥疯狂招od而不是之前的纯"外包&q ...

  5. 《系列二》-- 10、initialize-初始化bean

    目录 initializeBean 方法源码如下 二.重要操作 2.1 应用 Aware 2.2 applyBeanPostProcessorsBeforeInitialization: 2.3 in ...

  6. RESTful API 介绍,设计

    一:RESTful介绍 在互联网发展过程中,最开始是以html静态网页展示内容,url的表现形式一般为 http://www.example.com/getInfo.html:后来随着需求不断提高以及 ...

  7. Python 潮流周刊第 39 期(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  8. Youpk 脱壳机脱壳原理分析

    Youpk 是一个针对整体加固和Dex抽取加固壳的脱壳机 主要是基于虚拟机的,也就是基于VA的脱壳机, 相对FART出来的更晚一些, 厂商针对少一些, 脱壳位置相对更底层一些,还提供了Dex修复的工具 ...

  9. 以二进制文件安装K8S之部署etcd高可用集群

    概述 前提条件:已经准备好CA根证书(etcd在制作CA证书时需要CA根证书),并且把CA根证书文件ca.key和ca.crt拷贝到3个etcd节点的/etc/kubernetes/pki目录下. 3 ...

  10. KPTP 汇报模板

    1.什么是KPTP 它是由4个单词:Keep.Problem.Try.Plan的首字母组成的. K:keep,今天做了哪些工作: P:problem,遇到了哪些问题: T:try,计划尝试如何解决这些 ...