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. 推荐一款id生成器: Hashids

    唯一 id 生成的方式有很多种,比较常见的有以下几种方式: 语言自带功能,如 Java 中的 UUID,常用于后端 第三方工具提供,如 npm 中的 nanoid,常用于前端 Twitter 开源的 ...

  2. VMware全版本下载工具

    有很多小伙伴想下载适合自己的虚拟机版本,但是官网全是英文看不懂 百度找的还怕带病毒 这里栀煜单独制作了个工具,内置vm9 10 11 12 14 15 16 17版本的虚拟机下载地址,都是官方版 不是 ...

  3. NC15077 造一造

    题目链接 题目 题目描述 WYF正试图用一个栈来构造一棵树,现在他已经构造了n个元素作为树的节点,只要将这n个元素依次入栈出栈就可以形成一棵树了.当然,这个问题与树并没有关系,所以它叫做WYF的栈.每 ...

  4. Swoole从入门到入土(12)——HTTP服务器[Response]

    继上一节了解完请求对象之后,这一节我们着重了解响应对象(Response).响应对象主要用于将数据发现到客户端.当 Response 对象销毁时,如果未调用 end 发送 HTTP 响应,底层会自动执 ...

  5. Springboot+LayUI实现一个简易评论系统

    说明 这是个简单的评论系统,目的在于介绍简单的评论和回复功能.同时基于此可以扩展更全面的.自定义的评论系统,本工程仅供学习交流使用.喜欢的朋友给个赞:) 源码 https://gitee.com/in ...

  6. Springboot集成Druid连接池并实现数据库密码加密

    Druid介绍 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBoss ...

  7. git 添加子模块

    参考:https://www.jianshu.com/p/10ae453701ed 问题:如果一个子模块的分支不是最新的该怎么处理? 方法:在主仓库内使用 cd 命令切换到子模块的仓库,使用 git ...

  8. C++ std::move 的一些问题

    看 SO 上有一个比较奇怪的问题, When does an rvalue reference result in a move vs copy constructor and why? 问题代码: ...

  9. 使用RegSetValueEx创建键值

    #include <iostream> #include <string> #include <sstream> #include <fstream> ...

  10. 【Android 逆向】【攻防世界】easy-so

    1. apk安装到手机,随便输入点内容,提示错误 2. jadx打开apk btn.setOnClickListener(new View.OnClickListener() { // from cl ...