c语言之被遗漏的角落---#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 有了一定的理解。
后记
无
参考文献
无
打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
PS: 请尊重原创,不喜勿喷。
PS: 要转载请注明出处,本人版权所有。
PS: 有问题请留言,看到后我会第一时间回复。
c语言之被遗漏的角落---#pragma pack的更多相关文章
- 转载:C语言的字节对齐及#pragma pack的使用
C语言的字节对齐及#pragma pack的使用 C编译器的缺省字节对齐方式(自然对界) 在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间. 在结构中,编译器为结构的每个成员 ...
- C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)
转载地址 : http://blog.csdn.net/21aspnet/article/details/6729724 一.概念 对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它 ...
- C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)【转】
转自:https://www.cnblogs.com/ransn/p/5081198.html 转载地址 : http://blog.csdn.net/21aspnet/article/details ...
- pragma pack(字节对齐用法)---C语言
#pragma pack(4) typedef struct { char buf[3]; word a; }kk; #pragma pack() 对齐的原则是min(sizeof(word ),4) ...
- 关于pragma pack的用法(一)
一个很重要的参数#pragma pack(n) 数据边界对齐方式:以如下结构为例: struct { char a; WOR ...
- #pragma pack(push,1)与#pragma pack(1)的区别
这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n) 作用:C编译器将按照n个字节对 ...
- #pragma pack(n)
#pragma pack(n) 重要规则: 1,复杂类型中各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个类型的地址相同: 2,每个成员分别对齐,即每个成员按自己的方式对齐,并最小 ...
- warning malformed '#pragma pack(push[, id], n)' - ignored
bmp.c:8: warning: malformed '#pragma pack(push[, id], <n>)' - ignored bmp.c:33: warning: #prag ...
- C++编译指令#pragma pack的配对使用
#pragma pack可以用来指定C++数据结构的成员变量的内存对齐数值(可选值为1,2,4,8,16). 本文主要是强调在你的头文件中使用pack指令要配对使用,以避免意外影响项目中其他源文件的结 ...
- (转载)关于#pragma pack(push,1)和#pragma pack(1)
转载http://www.rosoo.net/a/201203/15889.html 一.#pragma pack(push,1)与#pragma pack(1)的区别 这是给编译器用的参数设置,有关 ...
随机推荐
- C++遴选出特定类型的文件或文件名符合要求的文件
本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法. 首先,我们来明确一下本文所需实现的需求.现在有一个文件夹,其中包含了很多文件,如下图所示:我们如果想获取其中所 ...
- 小知识:TFA收集日志报错空间不足
今天在某客户环境下分析某节点驱逐的故障,发现有安装TFA,所以使用一键收集包含故障时刻的日志 tfactl diagcollect -from "2020-08-14 03:00:00&qu ...
- 在.NET Core下的机器学习--学习笔记
摘要 .NET Core 在机器学习的应用场景,除了 ML .NET 还会介绍一个非常棒的開源技術 TensorFlow .NET , Keras .NET. 讲师介绍 本课内容 人工智能介绍 ML ...
- Windows 10 快捷键大全|日常办公效率加倍
## 复制.粘贴及其他常规 Ctrl + X 剪切选定项. Ctrl + C(或 Ctrl + Insert) 复制选定项. Ctrl + V(或 Shift + Insert) 粘贴选定项. ...
- NC223888 红色和紫色.md
题目链接 题目 题目描述 漫长的生命总是无聊的.这天,小红和紫准备玩一个染色游戏. 她们拿出了一个有 \(n*m\) 个格子的网格,每个格子只能被染成红色或紫色.每个人可以任意选择一个格子染成红色和紫 ...
- 【Unity3D】UGUI之Text
1 Text 简介 UGUI概述 中介绍了Canvas 渲染模式.RectTransform 组件.锚点(Anchor)等,本文将介绍 UGUI 中的 Text 控件. 在 Hierarchy ...
- OCP试题解析之053-61 RMAN set command id to
61.You frequently have multiple RMAN sessions running, and you want to be able to easily identify ea ...
- win32-LPCSTR->String
#include <string> void makebox(LPCSTR name) { std::string res(name); res += " is X"; ...
- pigz命令
多线程的解压缩文件 语法格式:pigz 参数 文件名 常用参数 -- 显示压缩后的内容 -p 设置线程数 -b 设置文件数据块大小 -q 静默执行模式 -d 将压缩文件恢复为原始文件 -r 递归处理所 ...
- shell之sort,uniq,cut,tr
# sort主要是要理解域 # sort选项 -c 测试文件是否已经分类 -m 合并两个分类文件 -u 删除所有复制行 -o 存储sort结果的输出文件名 -b 使用域进行分类时,忽略第一个空格 -n ...