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.hqwc.cn/news/417691.html

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

相关文章

传奇服务器搭建

传奇服务器搭建 传奇是一款非常经典的游戏&#xff0c;自从它推出以来就深受玩家们的喜爱。如果你也想要在自己的服务器上搭建一个传奇&#xff0c;那么本文将为你提供一些有用的信息。 首先&#xff0c;我们需要知道什么是传奇服务器。简单来说&#xff0c;它就是一个能够让…

32单片机RTC时间接续,掉电时间保存

1、实现思路 前提&#xff1a;首先要实现RTC掉电之后时间还能继续走&#xff0c;RTC电池是必要的 说明&#xff1a;设备第一次启动需要初始化配置RTC&#xff0c;但当二次启动再重新配置RTC会导致RTC计数器置零&#xff0c;所以传统的程序流程是不行的&#xff0c;我们需要知…

数据结构一:算法效率分析(时间复杂度和空间复杂度)-重点

在学习具体的数据结构和算法之前&#xff0c;每一位初学者都要掌握一个技能&#xff0c;即善于运用时间复杂度和空间复杂度来衡量一个算法的运行效率。所谓算法&#xff0c;即解决问题的方法。同一个问题&#xff0c;使用不同的算法&#xff0c;虽然得到的结果相同&#xff0c;…

x-cmd pkg | public-ip-cli - 公共 IP 地址查询工具

简介 public-ip-cli 是一个用 Javascript 编写的命令行工具&#xff0c;用于获取当前计算机或网络所使用的公共 IP 地址。 它可以让用户在命令行界面上查询 OpenDNS、Google DNS 和 HTTPS 服务的 DNS 记录以获取与互联网通信时所分配的公共 IP 地址。 首次用户 使用 x env us…

[开源]EBO机器人改装 动力增强板 最简单的4G无线距离小车

前言&#xff1a; 相信在疫情期间见了很多人做的4G小车&#xff0c;取外卖&#xff0c;取快递&#xff0c;买物资等用途&#xff0c;博主前段时间买了一个EBO逗猫机器人。就是他&#xff1a; 期初是为了逗猫玩的&#xff0c; 这个机器人4G低延迟图像&#xff0c;无线喊话&am…

快速玩转 Mixtral 8x7B MOE大模型!阿里云机器学习 PAI 推出最佳实践

作者&#xff1a;熊兮、贺弘、临在 Mixtral 8x7B大模型是Mixtral AI推出的基于decoder-only架构的稀疏专家混合网络&#xff08;Mixture-Of-Experts&#xff0c;MOE&#xff09;开源大语言模型。这一模型具有46.7B的总参数量&#xff0c;对于每个token&#xff0c;路由器网络选…

Hadoop详解

Hadoop 概念 就是一个大数据解决方案。它提供了一套分布式系统基础架构。 核心内容包含 hdfs 和mapreduce。hadoop2.0 以后引入 yarn. hdfs 是提供数据存储的&#xff0c;mapreduce 是方便数据计算的。 hdfs 又对应 namenode 和 datanode. namenode 负责保存元数据的基本信息…

实战纪实 | 某配送平台zabbix 未授权访问 + 弱口令

本文由掌控安全学院 - 17828147368 投稿 找到一个某src的子站&#xff0c;通过信息收集插件wappalyzer&#xff0c;发现ZABBIX-监控系统&#xff1a; 使用谷歌搜索历史漏洞&#xff1a;zabbix漏洞 通过目录扫描扫描到后台&#xff0c;谷歌搜索一下有没有默认弱口令 成功进去了…

HackTheBox - Medium - Linux - Health

Health Health 是一台中型 Linux 计算机&#xff0c;在主网页上存在 SSRF 漏洞&#xff0c;可利用该漏洞访问仅在 localhost 上可用的服务。更具体地说&#xff0c;Gogs 实例只能通过 localhost 访问&#xff0c;并且此特定版本容易受到 SQL 注入攻击。由于攻击者可以与 Gogs …

PyTorch 内 LibTorch/TorchScript 的使用

PyTorch 内 LibTorch/TorchScript 的使用 1. .pt .pth .bin .onnx 格式1.1 模型的保存与加载到底在做什么&#xff1f;1.2 为什么要约定格式&#xff1f;1.3 格式汇总1.3.1 .pt .pth 格式1.3.2 .bin 格式1.3.3 直接保存完整模型1.3.4 .onnx 格式1.3.5 jit.trace1.3.6 jit.scrip…

AtCoder Regular Contest 115 E. LEQ and NEQ(容斥 单调栈优化dp)

题目 n(n<5e5)个数&#xff0c;第i个数ai(1<ai<1e9) 构造一个序列b&#xff0c;要求bi∈[1,ai]&#xff0c;且b[i]不等于b[i1] 求方案数&#xff0c;答案对998244353取模 思路来源 洛谷题解Xu_brezza 一模一样的cf题&#xff1a; Codeforces Round 759 (Div. 2…

解析智能酒精壁炉不完全燃烧的成因及潜在问题

解析智能酒精壁炉不完全燃烧的成因及潜在问题 智能酒精壁炉作为一种环保、高效、现代化的取暖工具&#xff0c;其采用酒精作为燃料进行燃烧&#xff0c;但在一些情况下&#xff0c;可能会出现酒精燃烧不完全的问题。下面将深入探讨这一现象的成因以及可能引发的问题。 成因分析…