C++ 结构体的对齐

news2024/9/22 21:17:12

C++ 结构体的对齐

flyfish

文章目录

  • C++ 结构体的对齐
    • 一 非对齐方式
    • 二 对齐方式
      • 示例1
      • 示例2
    • 三 对齐到指定字节数 boundary

一 非对齐方式

也就是按照1字节对齐

#pragma pack(1)
typedef unsigned char BYTE;
typedef struct message
{
    BYTE a[4];
    BYTE b[2];
    BYTE *c;
    BYTE d[4];

} MESSAGE;

int main(void)
{
    MESSAGE m;

    m.c=new BYTE[200];
    std::cout<<sizeof(MESSAGE)<<":"<<sizeof(m)<<"\n";
    std::cout<<sizeof(m.a)<<":"<<sizeof(m.b)<<":"<<sizeof(m.c)<<":"<< sizeof(m.d);

    delete[] m.c;
    return 0;
}
18:18
4:2:8:4

指针的大小不依赖于它们所指向的数据类型,在64位系统下都是8
#pragma是一个特殊用途的指令,用于打开或关闭某些特性。#pragma pack(1)按照1字节对齐

二 对齐方式

说规则太生硬,可以看例子

示例1

typedef struct message
{
    BYTE a[7]; //7
    BYTE b[2]; //2
    BYTE c[9]; //11
    int d[1];  //4

} MESSAGE;

看下内存地址分布
在这里插入图片描述

BYTE a[7]:		C0 - C6
BYTE b[2]: 		C7 - C8
BYTE c[9]:		C9 - D3
int d[1] :			D4 

C9到D3 补了两个字节,也就是BYTE c[9]之后多了两个字节。共 9+2=11个字节
7+2+11+4=24 一共24个字节

示例2

typedef struct message
{
    BYTE a[4]; //4
    BYTE b[2]; //4
    double c;  //8
    BYTE d[4]; //8

} MESSAGE;

在这里插入图片描述
BYTE b[2] 后补了2个字节
BYTE d[4] 后补了4个字节
4+4+8+8 一共24个字节

计算机使用word boundary的概念来存储structure 。word boundary的大小(sizeof)与机器有关。
处理器不会一次从内存中读取一个字节。它一次读取一个word 。
例如在32位处理器中,它一次可以访问4个字节,这意味着word 为4字节。
在64位处理器中,它一次可以访问8个字节,这意味着word 为8字节。
将structure 补上字节数用于节省CPU周期数。

三 对齐到指定字节数 boundary

默认4字节

typedef struct  message
{
    BYTE a[7];
    BYTE b[2];
    BYTE c[9];
    int d[1];

} MESSAGE;
int main(void)
{
    MESSAGE m={};
    std::cout<<sizeof(MESSAGE)<<":"<<sizeof(m)<<":"<<sizeof(int*) <<":"<<alignof(MESSAGE)<<"\n";
    std::cout<<sizeof(m.a)<<":"<<sizeof(m.b)<<":"<<sizeof(m.c)<<":"<< sizeof(m.d);

    return 0;
}

使用alignas 对齐到16字节 boundary

typedef struct alignas(16) message
{
    BYTE a[7];
    BYTE b[2];
    BYTE c[9];
    int d[1];

} MESSAGE;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云ECS服务器企业级和共享型介绍_企业级常见问题解答FAQ

阿里云企业级服务器是什么&#xff1f;企业级和共享型有什么区别&#xff1f;企业级服务器具有独享且稳定的计算、存储、网络资源&#xff0c;如ECS计算型c6、通用型g8等都是企业级实例&#xff0c;阿里云百科分享什么是企业级云服务器、企业级实例的优势、企业级和共享型云服务…

如何收缩wsl2虚拟磁盘

简介 WSL2使用虚拟化层为它带来更高的性能和兼容性。但是&#xff0c;WSL2 的少数缺点之一是它使用虚拟磁盘 &#xff08;VHDX&#xff09; 来存储文件系统。这意味着您的虚拟磁盘占用了 100GB&#xff0c;但 WSL2 只需要 15GB... 所以要寻找一种缩小 WSL2 虚拟磁盘的方法&…

​Redis概述

目录 Redis - 概述 使用场景 如何安装 Window 下安装 Linux 下安装 docker直接进行安装 下载Redis镜像 Redis启动检查常用命令 Redis - 概述 redis是一款高性能的开源NOSQL系列的非关系型数据库,Redis是用C语言开发的一个开源的高键值对(key value)数据库,官方提供测试…

Leetcode每日一题:1444. 切披萨的方案数(2023.8.17 C++)

目录 1444. 切披萨的方案数 题目描述&#xff1a; 实现代码与解析&#xff1a; 二维后缀和 动态规划 原理思路&#xff1a; 1444. 切披萨的方案数 题目描述&#xff1a; 给你一个 rows x cols 大小的矩形披萨和一个整数 k &#xff0c;矩形包含两种字符&#xff1a; A …

根据Dockerfile创建容器案例讲解

-f为dokerfile的路径&#xff0c; -t为新镜像的名称及版本。 后面这个点是寻址路径。

【第三阶段】kotlin语言的字符串遍历操作

fun main() {val str1:String"AFWSDKFJWIUHGWINUWVRV"str1.forEach(){ it->println("所有字符&#xff1a;$it")} }执行结果

移动折叠隔断设计,自由与灵感的展现

移动折叠隔断设计可以展现自由与灵感的多样性&#xff0c;以下是一些相关的设计思路&#xff1a; 多样的材质选择&#xff1a;折叠隔断可以采用各种材质&#xff0c;如玻璃、木材、金属等&#xff0c;每种材质都有独特的质感和表现力。可以根据设计需求选择合适的材质&#xff…

数据结构—树表的查找

7.3树表的查找 ​ 当表插入、删除操作频繁时&#xff0c;为维护表的有序表&#xff0c;需要移动表中很多记录。 ​ 改用动态查找表——几种特殊的树 ​ 表结构在查找过程中动态生成 ​ 对于给定值key ​ 若表中存在&#xff0c;则成功返回&#xff1b; ​ 否则&#xff0…

postgresql 分类排名

postgresql 分类排名 排名窗口函数示例CUME_DIST 和 NTILE 排名窗口函数 排名窗口函数用于对数据进行分组排名。常见的排名窗口函数包括&#xff1a; • ROW_NUMBER&#xff0c;为分区中的每行数据分配一个序列号&#xff0c;序列号从 1 开始分配。 • RANK&#xff0c;计算每…

okhttp源码简单流程分析

拦截器详细解析可以看大佬简书 "https://www.jianshu.com/p/6fac73f7570f"和 “https://www.jianshu.com/p/3c740829475c” okhttp请求流程 1&#xff1a;OkHttpClient okHttpClient new OkHttpClient.Builder() 构建一个okhttpClient对象&#xff0c;传入你想传入的…

Wlan——锐捷AC冗余方案讲解(集群AC、热备AC、VAC)

目录 无线AC集群 AC集群的原理 AC集群的实现方式与配置 通过AC集群实现负载分担 AP的Failover优先级 优缺点 无线AC热备 AC热备的基本概念 AC热备工作原理 保活报文类型 热备工作模式 热备AC的配置 故障检查 优缺点 无线VAC VAC的基本概念 VSL链路和业务链路 …

软件需求-架构师之路(五)

软件需求 软件需求&#xff1a; 指用户 对系统在功能、行为、性能、设计约束等方面的期望。 分为 需求开发 和 需求管理 两大过程。 需求开发&#xff1a; 需求获取需求分析需求定义&#xff08;需求规格说明书&#xff09;需求验证&#xff1a;拉客户一起评审&#xff0c…

Vim在Mac电脑中的下载与安装方法:MacVim

本文介绍在Mac系统电脑中&#xff0c;下载、安装文本编辑器Vim软件&#xff08;MacVim软件&#xff09;的具体方法。 在Mac系统电脑中&#xff0c;原本就带有一个非图形界面的Vim&#xff1b;只要我们在终端中&#xff0c;输入如下的代码&#xff0c;就可以查看系统自带的非图形…

win10在vmware16.2.3上安装macos13.1系统

第一步、安装vmware版本信息如下 第二步、下载unlocker426放到安装文件夹 第三步、管理员身份运行unlock.exe 第四步、运行vmware新建虚拟机 第五步、启动新创建的虚拟机macOS13.1并选择语言 第六步、选择磁盘工具抹掉格式化安装磁盘 第七步、格式化完成后退出磁盘工具 第八步、…

网工内推 | 外企网工,带专业培训,NP认证优先

01 广州开讯通信技术有限公司 &#x1f537;招聘岗位&#xff1a;网络工程师 &#x1f537;职责描述&#xff1a; 1、负责组织制定系统集成项目的技术方案编写、标书的准备、讲解及用户答疑等工作; 2、配合客户经理完成与用户的技术交流、技术方案宣讲、系统演示等工作; 3、配…

【第三阶段】kotlin语言中的==与===比较操作

"" 内容的比较 相当于Java的equals() "" 引用的比较 1. fun main() {val str1"kotlin"val str2"kotlin"//java写法println(str1.equals(str2))//kt写法println(str1str2)//结论 str1.equals(str2)等价于str1str2 }执行结果 2. fu…

appium2 安装 和出现问题解决

1.安装环境 A macOS, Linux, or Windows operating systemNode.js version in the SemVer range ^14.17.0 || ^16.13.0 || >=18.0.0NPM version >= 8 (NPM is usually bundled with Node.js, but can be upgraded independently) 1.1只要安装nodejs最新版就好了 1.2安…

leetcode473. 火柴拼正方形(回溯算法-java)

火柴拼正方形 leetcode473 火柴拼正方形题目描述回溯算法 上期经典算法 leetcode473 火柴拼正方形 难度 - 中等 原题链接 - leetcode473 火柴拼正方形 题目描述 你将得到一个整数数组 matchsticks &#xff0c;其中 matchsticks[i] 是第 i 个火柴棒的长度。你要用 所有的火柴棍…

解决ios隔空播放音频到macos没有声音的问题

解决ios隔空播放音频到macos没有声音的问题 一、检查隔空播放支持设备和系统要求二、打开隔空播放接收器三、重置MAC控制中心进程END 一、检查隔空播放支持设备和系统要求 Mac、iPhone、iPad 和 Apple Watch 上“连续互通”的系统要求 二、打开隔空播放接收器 ps;我设备是同一…

第十三章 SpringBoot项目(总)

1.创建SpringBoot项目 1.1.设置编码 1.4.导入已有的spring boot项目 2.快速搭建Restfull风格的项目 2.1.返回字符串 RestController public class IndexController {RequestMapping("/demo1")public Object demo1() {System.out.println("demo1 ran...."…