#pragma pack笔记

2023-11-07

申明:内容来自stackoverflow,仅为方便自己以后忘记了再看时方便而转,https://www.google.com.hk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=7&ved=0CEUQFjAG&url=%68%74%74%70%3a%2f%2f%73%74%61%63%6b%6f%76%65%72%66%6c%6f%77%2e%63%6f%6d%2f%71%75%65%73%74%69%6f%6e%73%2f%33%33%31%38%34%31%30%2f%70%72%61%67%6d%61%2d%70%61%63%6b%2d%65%66%66%65%63%74&ei=jxC_VNfQNYjh8AWHhIKQBg&usg=AFQjCNECxkwOc-hCiFvuimFS7HyDEadhCw&bvm=bv.83829542,d.dGc&cad=rjt

#pragma pack instructs the compiler to pack structure members with particular alignment. Most compilers, when you declare a struct, will insert padding between members to ensure that they are aligned to appropriate addresses in memory (usually a multiple of the type's size). This avoids the performance penalty (or outright error) on some architectures associated with accessing variables that are not aligned properly. For example, given 4-byte integers and the following struct:

struct Test
{
   char AAA;
   int BBB;
   char CCC;
};

The compiler could choose to lay the struct out in memory like this:

 Bytes: |  1  |  2  3  4  |  5  6  7  8  |  9  |  10 11 12  |
Member: | AAA |  padding  |  BBB         | CCC |  padding   |

and sizeof(Test) would be 12, even though it only contains 6 bytes of data. The most common use case for the #pragma (to my knowledge) is when working with hardware devices where you need to ensure that the compiler does not insert padding into the data and each member follows the previous one. With #pragma pack(1), the struct above would be laid out like this:

 Bytes: |  1  |  2  3  4  5  |  6  |
Member: | AAA |     BBB      | CCC |

And sizeof(Test) would be 6.

With #pragma pack(2), the struct above would be laid out like this:

 Bytes: |  1  |    2    |  3  4  5  6  |  7  |    8    |
Member: | AAA | padding |     BBB      | CCC | padding |

And sizeof(Test) would be 8.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#pragma pack笔记 的相关文章

  • C++_生成随机字符串

    include
  • 每天都在谈SOA和微服务,但你真的理解什么是服务吗?

    近几年来 我一直从事着和面向服务相关的底层软件研发工作 逐渐的形成了一些自己的看法 其中我觉得比较重要的看法就是服务需要一个更准确细致的定义 简单来说 服务的本质就是行为 业务活动 的抽象 为了更好的阐述新服务的概念 并方便与传统的SOA中
  • C++知识积累:内存对齐理解

    为什么要进行内存对齐 这是因为CPU的读取总是对齐的 举个例子 假设CPU是32位的 那么CPU每次读取的4字节数据的首地址都是4的倍数 也就是说 内存中数据首地址为4的倍数时 CPU一次操作就可以完成数据读取 假设有一个int型四字节大小
  • 调用拷贝构造函数的几种情况(附面试题)

    1 深拷贝和浅拷贝 拷贝构造函数的使用 有时候需要自己定义拷贝构造函数 以避免浅拷贝问题 在什么情况下需要用户自己定义拷贝构造函数 一般情况下 当类中成员有指针变量 类中有动态内存分配时常常需要用户自己定义拷贝构造函数 在什么情况下系统会调
  • 多线程系列之——事件内核对象

    所有内核对象里面事件内核对象是最简单的一个 它包括一个使用计数 还有两个布尔值 一个布尔值用来表示事件是手动重置事件还是自动重置事件 另一个布尔值表示当前是否处于触发状态 当一个手动重置事件被触发的时候 所有等待该事件的线程都能变成调度状态
  • 解决“17: 错误:程序中有游离的‘\240’,\302’

    参考链接 https blog csdn net asuphy article details 54602426 执行如下命令即可 sed i s o240 o302 g dy haikang test cpp
  • C语言pcre库的使用及验证IP地址的合法性

    PCRE是一个用C语言编写的正则表达式函数库 它十分易用 同时功能也很强大 性能超过了POSIX正则表达式库和一些经典的正则表达式库 在使用PCRE库时 首先肯定是需要安装pcre的 不过一般的系统都会有自带的PCRE库 不过如果想使用最新
  • C++工程师复习题

    一 auto ptr 类使用必须满足下列限制 1 不要使用 auto ptr 对象保存指向静态分配对象的指针 2 不要使用两个 auto ptrs 对象指向同一对象 3 不要使用 auto ptr 对象保存指向动态分配数组的指针 4 不要将
  • 编写程序模拟完成动态分区存储管理方式的内存分配和回收。

    usr bin python coding utf 8 class Table object 空闲分区表 0 开始地址 1 长度 freeTable 占用分区表 0 程序名 1 开始地址 2 长度 useTable def init sel
  • 写时拷贝技术(copy-on-write)

    传统的fork 系统调用直接把所有的资源复制给新创建的进程 这种实现过于简单并且效率低下 因为它拷贝的数据也许并不共享 更糟的情况是 如果新进程打算立即执行一个新的映像 那么所有的拷贝都将前功尽弃 Linux的fork 使用写时拷贝 cop
  • C/C++中浮点数格式学习——以IEEE75432位单精度为例

    这是浮点数的通常表示形式 在IEEE754中 单精度浮点数有如下形式 32位单精度 单精度二进制小数 使用32个比特存储 1 8 23位长 S Exp Fraction 31 30至23偏正值 实际的指数大小 127 22至0位编号 从右边
  • vector,list,deque区别

    http blog csdn net renkaihao article details 6803866 vector和built in数组类似 它拥有一段连续的内存空间 并且起始地址不变 因此它能非常好的支持随即存取 即 操作符 但由于它
  • dev-c++官网位置和源码/库位置

    1 http devpaks org 2 http www bloodshed net 3 http www bloodshed net dev 转载于 https www cnblogs com vilyLei articles 1812
  • c语言判断一个数是否为偶数

    include
  • 【C/C++】 - Linux下查找函数头文件 以及 man命令拓展

    背景 比如现在需要找C语言 sleep函数的头文件 使用man来查找 可以先man sleep 可以发现出来的默认是sleep 1 是一个User Commands 明显不是我们需要的 这里提示了 看sleep 3 那我们查看下sleep
  • visual studio 一直显示正在准备解决方案

    首先重启电脑 无法解决的情况下执行以下步骤 Kill Visual Studio Open Visual Studio without loading a solution Disable AnkhSvn as Source Control
  • enable_shared_from_this使用介绍

    文章目录 enable shared from this定义 使用场合 源码实现 注意 enable shared from this定义 定义于头文件 template lt class T gt class enable shared
  • C++常见STL容器基本用法

    1 vector include
  • C++ 字符串比较------strcmp函数和strncmp函数

    strcmp 函数原型 int strcmp const char str1 const char str2 功能 strcmp函数会按照字典顺序逐个比较两个字符串的字符 直到遇到不同的字符或者遇到字符串结束符 0 返回值 该函数返回值如下
  • C++实现函数重载的原理

    一 函数重载的概念 C 中允许存在同名函数 但要求函数参数的类型 个数不同 这些同名函数就称为函数的重载 void func int a int b cout lt lt func int a int b lt lt endl void f

随机推荐

  • input 输入框 focus更改样式

    input标签的border和outline 想要实现input在触发焦点时更改样式 通常会想到使用 focus选择器 但当使用border去更改样式时 会发现失效了 input type text focus border 1px sol
  • 内部振荡器、无源晶振、有源晶振有什么区别?

    单片机要运行起来 必须有一个时钟信号 就好像人的心跳 这个时钟信号可以由无源晶振提供 可以由有源晶振提供 目前大部分的单片机也集成了内部振荡器 今天就来聊聊这三者的区别 1 内部振荡器 单片机内部集成的振荡器 一般为RC振荡器 好多人叫 内
  • AlexNet-深度卷积神经网络(CNN卷积神经网络)

    文章目录 深度卷积神经网络 AlexNet AlexNet 模型说明 激活函数选定 模型定义 读取数据集 训练AlexNet 小结 深度卷积神经网络 AlexNet 2012年 AlexNet横空出世 它首次证明了学习到的特征可以超越出手工
  • cJSON.c 和cJSON.h (进行了额外的封装)

    1 cJSON h cJSON h Copyright c 2009 2017 Dave Gamble and cJSON contributors Permission is hereby granted free of charge t
  • EMI原理、测量、解决

  • 进制和编码

    目标 了解计算机中一些必备的尝试知识 了解常见名词背后的意义 1 python的运行方式 交互式运行 脚本式运行 2 进制 2 1 进制的转换 计算机中底层的所有数据都是0101010101的形式存在的 八进制无法直接转为2进制 十进制转其
  • 鸡兔同笼问题南阳理工学院acm64题

    问题如下 鸡兔同笼 时间限制 3000 ms 内存限制 65535 KB 难度 1 描述 已知鸡和兔的总数量为n 总腿数为m 输入n和m 依次输出鸡和兔的数目 如果无解 则输出 No answer 不要引号 输入 第一行输入一个数据a 代表
  • centos哪个版本稳定_CentOS VS Ubuntu,谁才是更好的 Linux 版本?

    几乎所有新手刚接触 Linux 时 都会被它众多的发行版本搞得一头雾水 截至目前 Linux 已经有几百个发行版本 从技术上来说 Linux 只是一个内核 内核指的是一个提供设备驱动 文件系统 进程管理 网络通信等功能的系统软件 并不是一套
  • 混合式步进电机的细分驱动(电流方式、电压方式)及Simulink仿真对比

    两相混合式步进电机的最简单模型和驱动方式 两相混合式步进电机有四个连接点 分别为a a b b a 和a 连接绕组A的两端 b 和b 连接绕组B的两端 电机的结构可以简化为如下的图示结构 电机转子可以看成一个磁铁 电机的定子上标有a b a
  • OJ刷题 第十三篇

    22102 将字符串反序 时间限制 1 秒 内存限制 128 MB 请将一个给定的字符串反序 字符长度为1到10000 且有可能包含空格 输入 反序前的字符串 输出 反序后的字符串 样例 输入 abcd 输出 dcba 答案 C 版本1 掌
  • 2021年第十二届蓝桥杯省赛A组题解(C/C++)

    2021年蓝桥杯省赛A组题解 C C 来自微信公众号 算法梦工厂 二维码见文末 欢迎加入蓝桥杯备赛群 768245918 获取往届试题 测试数据 算法课程等相关资源 A 卡片 问题描述 答案 3181 解析 涉及知识点 枚举 十进制拆分 做
  • 远程链接redis时出现错误: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

    Could not connect to Redis at 192 168 204 100 6379 由于连接方在一段时间后没有正确答复或连接的主机没有反应 连接尝试失败 原因 1 防火墙没有关闭 导致访问不了 解答方法一直接关闭防火墙 不
  • 软件优化Flash擦除时间长的方法

    概述 通过地址的偏移 巧妙的避开Flash擦除长时间占用CPU的使用 MCU STM32H743 编译环境 Keil 说明 基础知识可以看 Flash读写 其中包含了本代码涉及到的所有函数 原理 以空间换取时间 正文 首先要明白Flash擦
  • SpringBoot学习(汇总版)

    一 SpringBoot简介 1 1 Spring能做什么 1 1 1 Spring的能力及生态 1 1 2 Spring5的响应式编程 1 2 SpringBoot是什么 百度百科 Spring Boot是由Pivotal团队提供的全新框
  • MYSQL物理结构

    Mysql的物理结构 日志文件 error log 记录mysql启动 关闭和运行时产生的重大的错误的信息 如果mysqld警告一个表需要自动的检查或者修复 也会记录一个错误日志 可以使用 log error file name选项来指定错
  • Oracle数据库对象---你diss了嘛

    1 数据库对象 2 同义词 3 序列 4 视图 5 索引 Oracle中比较有特色的 同义词 序列 1 数据库对象 又称模式对象 是逻辑结构的集合 最基本的数据库对象就是表 数据逻辑结构 指的是存在一种或多种特定关系的数据元素集合 通俗点
  • Devops学习实践(三) jenkins集成findbugs

    随着工作的要求 devops作为今年工作的一个重点 由此也引发了自己对于devops相关的工具和技术的学习和实践 基于上述背景 这个系列将逐步的介绍SVN的安装和配置 jenkins安装和配置 reviewboard findbugs ch
  • SourceTree 重置提交、合并、撤销、回滚

    SourceTree重置当前分支到此次提交 使用场景 已提交未推送的修改撤销 想把某一次的错误修改全部撤销 当前发布代码有bug需要切到上次提交发布版本 Git中的HEAD解释 使用最新一次提交重制暂存区 git reset HEAD fi
  • 2019-6-26 opencv图像分割(image segmentation)

    图像分割 image segmentation 是图像预处理的重要步骤之一 它的主要目标是将图像划分为不同的区域 这些区域与真实世界中的物体具有一定的关联成分 图像分割的方法大体分为三种 基于阈值的分割 基于边缘的分割和基于区域的分割 理论
  • #pragma pack笔记

    申明 内容来自stackoverflow 仅为方便自己以后忘记了再看时方便而转 https www google com hk url sa t rct j q esrc s source web cd 7 ved 0CEUQFjAG ur