C内存对齐问题

一、主要参考:

C/C++编程笔记:C语言对齐问题【结构体、栈内存以及位域对齐】_二进制异常退出,栈对齐-CSDN博客

其中关于内存对齐,讲了结构体以及位域,以及一些容易出错的地方,非常好。

结构体对齐:

下面提到的对齐模数就是上面提到的有效对齐值N。

位域对齐:

注意,这里讲位域只能用在结构体或联合体中。

注意位域对齐,既要考虑自身字节存储时需不需要填充位,又要考虑整体作为结构体存储时需不需要填充字节。

注意事项:

写的很好了。

二、

结构体对齐规则整理,可以看这篇:

C语言结构体对齐详解-CSDN博客

有个规则总结:注意结构体各成员变量字节数先取最大值,然后和系统设定对齐字节数,取较小值,作为最终结构体对齐字节数,即结构体总字节数需要是这个字节数的整数倍。

参考以下程序,也是网上公开的:

//内存对齐计算验证实例
#include<stdio.h>
#include <stddef.h>#pragma pack(2)  // 值只能填1 2 4 8 16 但是当#pragma pack指定的值等于或者超过所有数据成员长度的时候,这个指定值的大小将不产生任何效果typedef struct test {char a;int b;double c;char d;
}Test;int main(int argc, char** argv)
{Test T;int offset_a = offsetof(Test, a);int offset_b = offsetof(Test, b);int offset_c = offsetof(Test, c);int offset_d = offsetof(Test, d);printf("The length of char type is %u\n", sizeof(char));printf("The length of int type is %u\n", sizeof(int));printf("The length of double type is %u\n\n", sizeof(double));printf("The length of the whole struct is %u\n\n", sizeof(T));printf("The offset of first data member is %d\n", offset_a);printf("The offset of second data member is %d\n", offset_b);printf("The offset of third data member is %d\n", offset_c);printf("The offset of fourth data member is %d\n\n", offset_d);printf("The begin address of first data member of struct test is %p\n", &(T.a));printf("The begin address of second data member of struct test is %p\n", &(T.b));printf("The begin address of third data member of struct test is %p\n", &(T.c));printf("The begin address of fourth data member of struct test is %p\n\n", &(T.d));return 0;
}

这个结果是16。很容易错。

因为一般不加#pragma pack(2)这句,则系统默认是8字节对齐,刚好结构体中double型变量字节数是8,则最终结构体存储需要8字节对齐,即总字节数需要是8的整数倍,算出结果是24。即:1+3(填充)+4+8+1+7(填充)。

如果将#pragma pack(2)中2改为1,即,1字节对齐,则实际上不补充字节了。

三、

第一篇文章最后总结,栈的对齐问题:

栈的内存对齐问题,可能不对。可参看下面文章:

内存对齐:C/C++编程中的重要性和技巧_malloc 内存对齐-CSDN博客

但是这篇写的比较啰嗦,关注的栈内存对齐和结构体对齐的区别在这:

即,结构体作为一个整体,整个结构体变量需要在考虑每个成员变量按照各自数据类型在内存中对齐存储之外,最终可能还需要额外在尾部补充字节使结构体总字节数是其字节数最长的成员变量对应的数据类型字节数和系统对齐设置字节数中较小者的整数倍(参考结构体对齐字节数规定哈)。而栈对齐,只考虑每个变量按各自数据类型对齐地址存储即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/243342.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目风险管理

风险分类&#xff1a; 分类性质&#xff1a;纯粹风险&#xff0c;投机风险---对应火灾&#xff0c;股票买卖 产生原因&#xff1a;自然&#xff0c;社会&#xff0c;政治&#xff0c;经济&#xff0c;技术 风险性质&#xff1a;客观性&#xff0c;偶然性&#xff0c;相对性&a…

MySQL---多表等级查询综合练习

创建emp表 CREATE TABLE emp( empno INT(4) NOT NULL COMMENT 员工编号, ename VARCHAR(10) COMMENT 员工名字, job VARCHAR(10) COMMENT 职位, mgr INT(4) COMMENT 上司, hiredate DATE COMMENT 入职时间, sal INT(7) COMMENT 基本工资, comm INT(7) COMMENT 补贴, deptno INT…

锂电池SOC估计 | PatchTST时间序列模型锂电池SOC估计

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池SOC估计 | PatchTST时间序列模型锂电池SOC估计 采用新型PatchTST时间序列模型预测锂电池SOC&#xff0c;送锂电池数据集 可替换数据集&#xff0c;实现负荷预测、流量预测、降雨量预测、空气质量预测等其他多种…

[足式机器人]Part2 Dr. CAN学习笔记- 最优控制Optimal Control Ch07-2 动态规划 Dynamic Programming

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - 最优控制Optimal Control Ch07-2 动态规划 Dynamic Programming 1. 基本概念2. 代码详解3. 简单一维案例 1. 基本概念 Richoard Bell man 最优化理论&#xff1a; An optimal policy has the …

Spring-配置文件

一、引子 了解完Spring的基本概念后&#xff0c;我们紧接着来了解Spring中的核心文件--Spring配置文件。 二、配置Bean 我们在上一节Spring的基本概念中快速使用了一下Spring&#xff0c;其中我们在配置文件中主要涉及到就是Bean标签的配置&#xff1a;主要的配置字段有id, …

【漏洞攻击之文件上传条件竞争】

漏洞攻击之文件上传条件竞争 wzsc_文件上传漏洞现象与分析思路编写攻击脚本和重放措施中国蚁剑拿flag wzsc_文件上传 漏洞现象与分析 只有一个upload前端标签元素&#xff0c;并且上传任意文件都会跳转到upload.php页面&#xff0c;判定是一个apache容器&#xff0c;开始扫描…

Windows 下ffmpeg安装及实践

Windows 下ffmpeg安装及实践 背景安装实践其他 背景 最近负责音频文件处理相关的业务&#xff0c;涉及到 ffmpeg 对一些音频文件格式的校验&#xff0c;记录一下安装过程及踩坑过程。 安装 如图1所示&#xff0c;进入官网&#xff0c;在windows下任选一个文件&#xff1a;h…

【笔记】Blender4.0建模入门-3物体的基本操作

Blender入门 ——邵发 3.1 物体的移动 演示&#xff1a; 1、选中一个物体 2、选中移动工具 3、移动 - 沿坐标轴移动 - 在坐标平面内移动 - 自由移动&#xff08;不好控制&#xff09; 选中物体&#xff1a;右上的大纲窗口&#xff0c;点击物体名称&#xff0c;物体的轮…

大模型笔记【3】 gem5 运行模型框架LLama

一 LLama.cpp LLama.cpp 支持x86&#xff0c;arm&#xff0c;gpu的编译。 1. github 下载llama.cpp https://github.com/ggerganov/llama.cpp.git 2. gem5支持arm架构比较好&#xff0c;所以我们使用编译LLama.cpp。 以下是我对Makefile的修改 开始编译&#xff1a; make UNAME…

利用 ChatGPT 高效搜索:举一反三的思考方式,高效查找解决方案

文章目录 基础思路举一反三全面了解 GO 的 Web 框架系统方案建议 - 让 ChatGPT 推断我的一些微末思考结论 本文只是我的一些尝试&#xff0c;基于 ChatGPT 实现系统化快速搜索某编程语言的特定领域相关包或者基于其他语言类推荐落地方案的尝试。 这篇文章中描述的方式不一定是…

python高级(1): 迭代器详解

文章目录 1. 迭代器与可迭代对象(Iterable)1.1 可迭代对象(Iterable)1.2 迭代器( Iterator) 2. 自定义一个可迭代器2.1 实现迭代器2.2 for 遍历迭代器的过程 3. yolov8 Dataset实现案例 Python迭代器的作用是提供一种遍历数据集合的方式。它是一个可以被迭代的对象&#xff0c;…

【差分数组】【图论】【分类讨论】【整除以2】100213按距离统计房屋对数目

作者推荐 【动态规划】【数学】【C算法】18赛车 本文涉及知识点 差分数组 图论 分类讨论 整除以2 LeetCode100213按距离统计房屋对数目 给你三个 正整数 n 、x 和 y 。 在城市中&#xff0c;存在编号从 1 到 n 的房屋&#xff0c;由 n 条街道相连。对所有 1 < i < n…

ARM_Linux中GCC编译器的使用

目录 前言: GCC编译过程: 预处理&#xff1a; 编译阶段&#xff1a; 汇编&#xff1a; 链接阶段 GCC的常见使用 前言: 什么是GCC: gcc的全称是GNU Compiler Collection&#xff0c;它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器&#xff08;GNU C Co…

深度学习记录--指数加权平均

指数加权移动平均(exponentially weighted moving averages) 如何对杂乱的数据进行拟合&#xff1f; 通过指数加权平均可以把数据图近似拟合成一条曲线 公式&#xff1a; 其中表示第t个平均数&#xff0c;表示第t-1个平均数&#xff0c;表示第t个数据&#xff0c;表示变化参数…

tkinter绘制组件(40)——滚动选值框

tkinter绘制组件&#xff08;40&#xff09;——滚动选值框 引言布局函数结构文本展示选择器布局完整函数代码 效果测试代码最终效果 github项目pip下载结语 引言 2023年基本没有怎么更新TinUI组件部分&#xff0c;而滚动选值框&#xff08;picker&#xff09;&#xff0c;是在…

《WebKit 技术内幕》学习之七(4): 渲染基础

4 WebKit软件渲染技术 4.1 软件渲染过程 在很多情况下&#xff0c;也就是没有那些需要硬件加速内容的时候&#xff08;包括但不限于CSS3 3D变形、CSS3 03D变换、WebGL和视频&#xff09;&#xff0c;WebKit可以使用软件渲染技术来完成页面的绘制工作&#xff08;除非读者强行…

Vue基础入门 - Vue的快速创建、Vue的开发者工具安装及Vue的常用指令(v-model,v-bind,computed计算属性,watch侦听器)

Vue 文章目录 Vue1 什么是Vue2 创建Vue实例2.1 快速创建2.2 插值表达式 {{}}2.3 响应式特性2.3.1 访问与修改 3 Vue开发者工具安装4 Vue中的常用指令4.1 内容渲染指令4.2 条件渲染指令4.3 事件绑定指令4.4 属性绑定指令4.5 案例-上下页图片翻页4.6 列表渲染指令4.7 案例-能删除…

flink部署模式介绍

在一些应用场景中&#xff0c;对于集群资源分配和占用的方式&#xff0c;可能会有特定的需求。Flink 为各种场景提供了不同的部署模式&#xff0c;主要有以下三种&#xff0c;它们的区别主要在于&#xff1a; 集群的生命周期以及资源的分配方式&#xff1b;应用的 main 方法到…

谷歌浏览器通过network模拟HTTP中的GET/POST请求获取response

1、F12打开network选中需要模拟的方法Copy->Copy as fetch 2、通过AI帮你进行转换一下调用格式 原代码 fetch("https://mp.amap.com/api/forward/aggregate?mtop.alsc.kbt.intergration.toolkit.call.queryCallBlockInfo", {"headers": {"acce…

03--数据库连接池

1、数据库连接池 1.1 JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时&#xff0c;传统的模式基本是按以下步骤&#xff1a; 在主程序&#xff08;如servlet、beans&#xff09;中建立数据库连接进行sql操作断开数据库连接 这种模式开发&#xff0c;存在的问题:…