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


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

PS: 这个只是基于《我自己》的理解,
如果和你的原则及想法相冲突,请谅解,勿喷。

环境说明

  无

前言


  前述:懒人一个,闲的无聊。上网,偶然发现一个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: 有问题请留言,看到后我会第一时间回复。


文章作者: Sky
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Sky !
  目录