C++:静态断言内存对齐

静态断言

  • C中的断言assert
    (1)直接参考:https://www.cnblogs.com/lvchaoshun/p/7816288.html
    (2)C的assert是运行时检测发现错误,而不是编译时
    (3)C在编译时错误用#error来输出
  • C++静态断言
    (1)C++引入static_assert(表达式, “提示字符串”)来实现编译时的静态断言
    (2)实例演示
#include <iostream>
#include <type_traits>// 编译期常量表达式
constexpr int factorial(int n) {return (n <= 1) ? 1 : (n * factorial(n - 1));
}int main() {// 编译时断言:检查某些条件是否成立static_assert(sizeof(int) == 4, "int 类型的大小不是 4 字节");static_assert(factorial(5) == 120, "Factorial 计算错误");std::cout << "所有静态断言均通过。" << std::endl;return 0;
}
#include <iostream>
#include <cassert>int factorial(int n) {assert(n >= 0); // 断言n是非负数if (n == 0) {return 1;} else {return n * factorial(n - 1);}
}int main() {int num1 = 5;int num2 = -3;// 正常情况std::cout << "Factorial of " << num1 << " is " << factorial(num1) << std::endl;// 异常情况(将触发断言)std::cout << "Factorial of " << num2 << " is " << factorial(num2) << std::endl;return 0;
}
  • 静态断言主要用途
    (1)static_assert主要用于检查模板参数是否符合期望
    (2)C++20中引入了concept来进一步更好的实现模板参数的编译时类型匹配检查

内存对齐

  • C语言中内存对齐关键点
    (1)#pragma 和 attribute((packed)) attribute((aligned(n)))
#include <stdio.h>// 使用 #pragma pack 控制对齐
#pragma pack(push, 1) // 设置为1字节对齐typedef struct {char c;int i;double d;
} PackedStruct;#pragma pack(pop) // 恢复默认对齐// 使用 __attribute__((packed)) 控制对齐
typedef struct {char c;int i;double d;
} __attribute__((packed)) PackedStructAttribute;// 使用 __attribute__((aligned(n))) 控制对齐
typedef struct {char c;int i;double d;
} AlignedStruct __attribute__((aligned(16)));int main() {PackedStruct ps;PackedStructAttribute psa;AlignedStruct as;printf("Size of PackedStruct: %zu bytes\n", sizeof(PackedStruct));printf("Size of PackedStructAttribute: %zu bytes\n", sizeof(PackedStructAttribute));printf("Size of AlignedStruct: %zu bytes\n", sizeof(AlignedStruct));printf("Address of ps.c: %p\n", (void*)&ps.c);printf("Address of ps.i: %p\n", (void*)&ps.i);printf("Address of ps.d: %p\n", (void*)&ps.d);printf("Address of psa.c: %p\n", (void*)&psa.c);printf("Address of psa.i: %p\n", (void*)&psa.i);printf("Address of psa.d: %p\n", (void*)&psa.d);printf("Address of as.c: %p\n", (void*)&as.c);printf("Address of as.i: %p\n", (void*)&as.i);printf("Address of as.d: %p\n", (void*)&as.d);return 0;
}

在这里插入图片描述

  • C++中内存对齐新增关键字
    (1)alignof (C++11 起) 查询对齐要求
    (2)alignas (C++11 起)设置对齐,效果:和__attribute__((aligned(n)))效果一样,往大了设置有用
#include <iostream>
#include <cstddef> // for std::size_t// 使用 alignas 设置对齐
struct alignas(16) AlignedStruct {char c;int i;double d;
};// 未对齐的结构体
struct UnalignedStruct {char c;int i;double d;
};int main() {// 使用 alignof 查询对齐要求std::cout << "Alignment of char: " << alignof(char) << std::endl;std::cout << "Alignment of int: " << alignof(int) << std::endl;std::cout << "Alignment of double: " << alignof(double) << std::endl;std::cout << "Alignment of AlignedStruct: " << alignof(AlignedStruct) << std::endl;std::cout << "Alignment of UnalignedStruct: " << alignof(UnalignedStruct) << std::endl;// 打印结构体大小std::cout << "Size of AlignedStruct: " << sizeof(AlignedStruct) << std::endl;std::cout << "Size of UnalignedStruct: " << sizeof(UnalignedStruct) << std::endl;// 分配对齐的内存void* ptr = aligned_alloc(alignof(AlignedStruct), sizeof(AlignedStruct));if (ptr) {std::cout << "Memory allocated at address: " << ptr << std::endl;free(ptr); // 记得释放内存} else {std::cerr << "Memory allocation failed!" << std::endl;}return 0;
}

在这里插入图片描述

  • 什么情况下需要人为改变/指定对齐方式
    (1)往大去对齐。有时候会有一些硬件特殊要求,譬如MMU,cache等。用__attribute__((aligned(n)))实测ok,用#pragma实测不ok
    (2)往下去对齐。有时候需要节省内存而浪费效率,所以希望忽略内存对齐,紧密排放。用#pramgma实测ok,用__attribute__((aligned(n)))实测不ok

总结

了解static_assert的使用方法
了解alignof 、alignas,可以实现内存对齐

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

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

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

相关文章

window搭建git环境

1.下载安装window下git专用软件scm 从Git for Windows 官网网站下载&#xff0c;并且一路安装即可 安装成功后通过桌面快捷图标Git Bash点击打开 安装后软件应该会自动帮助配置环境变量&#xff0c;如果没有需要自己配置使用 2.git环境配置 2.1设置姓名和邮箱(github上你注…

封装了一个iOS滚动厨窗效果

效果图 背景 我们要实现如图的厨窗效果&#xff0c;不能通过在tableView底部添加一个背景图片的方式&#xff0c;因为这需要修改整个tableView的背景色为透明&#xff0c;影响到的范围太大&#xff0c;只能将这个效果局限在这个cell 中&#xff0c;然后通过监听tableView的滚动…

追觅科技25届校招校招24年社招科技北森题库商业推理综合测评答题攻略、通关技巧

一、追觅科技这家公司怎么样&#xff1f; 追觅科技是一家在智能清洁家电领域表现出色的企业。 二、追觅科技待遇怎么样 追觅科技的待遇在业内具有竞争力&#xff0c;具体信息如下&#xff1a; 1. **薪酬结构**&#xff1a;根据对外经济贸易大学招生就业处发布的2023届校园招…

虹科技术丨跨越距离障碍:PCAN系列网关在远程CAN网络通信的应用潜力

来源&#xff1a;虹科技术丨跨越距离障碍&#xff1a;PCAN系列网关在远程CAN网络通信的应用潜力 原文链接&#xff1a;虹科技术 | 跨越距离障碍&#xff1a;PCAN系列网关在远程CAN网络通信的应用潜力 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #PCAN #网关 #CA…

Flask之电子邮件

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、使用Flask-Mail发送电子邮件 1.1、配置Flask-Mail 1.2、构建邮件数据 1.3、发送邮件 二、使用事务邮件服务SendGrid 2.1、注册SendGr…

最新源支付系统源码 V7版全开源 免授权 附搭建教程

最新源支付系统源码_V7版全开源_免授权_附详细搭建教程_站长亲测 YPay是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI&#xff0c;让您能更方便快捷地解决知识付费和运营赞助的难题。同时&#xff0c;它基于高性能的thin…

TypeScript学习笔记(全)

文章目录 TypeScript入门2.编译并运行TS代码2.1.简化运行ts步骤 3.TS中的常用类型3.1.TS中的类型注解3.2.TS中的原始类型3.3.TS中的数组类型3.4.TS中的联合类型3.5.类型别名3.6.函数类型3.6.1.单独执行参数、返回值类型3.6.2.同时指定参数&#xff0c;返回值类型3.6.3.函数的vo…

广东省钟表行业协会第十二届会员大会暨2024年钟表行业发展交流会

6月25日广东省钟表行业协会第十二届会员大会暨2024年钟表行业发展交流会在广州万富希尔顿酒店隆重召开。大会选举沙胜昔为广东省钟表行业协会第十二届理事会会长。 领导发言 新任会长 沙胜昔 首席荣誉会长 吴伟阳 新老会长交接仪式 本次大会&#xff0c;全国钟表大伽齐参与…

前端Web开发HTML5+CSS3+移动web视频教程 Day3 CSS 第1天

P29 - P43 从此开始进入 CSS 的学习。前面都是 HTML 的学习。 CSS 的作用&#xff1a;美化。 HTML 只是规定了网页内容有哪些&#xff0c;在网页中显示的位置默认是从上到下显示&#xff0c;还带有默认效果&#xff0c;比如超链接有颜色有下划线&#xff0c;无序列表有小圆点…

CSS Flex弹性布局

一、传统布局与flex布局 1、传统布局 2、flex布局 二、flex布局原理 1、布局原理 2、flex布局体验 三、flex布局父项常见属性 1、常见的父项属性 2、flex-direction设置主轴的方向 3、justify-content 设置主轴上的子元素排列方式 4、flex-wrap 设置子元素是否换行 …

二叉树从根节点出发的所有路径

二叉树从根节点出发的所有路径 看上图中 二叉树结构 从根节点出发的所有路径 如下 6->4->2->1 6->4->2->3 6->4->5 6->8->7 6->8->9 逻辑思路&#xff1a; 按照先序遍历 加 回溯法 实现 代码如下 // 调用此方法&#xff0c;将根节点传递…

上位机图像处理和嵌入式模块部署(mcu 项目1:上位机编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面&#xff0c;我们说过要做一个报警器。如果只是简单做一个报警器呢&#xff0c;这个基本上没有什么难度。这里&#xff0c;我们就适当提高一下…

Navicat上新啦

前言 Navicat&#xff0c;在数据库界&#xff0c;几乎是一个神奇的存在&#xff0c;似乎统治了数据库开发工具的“一片天”。且看下图&#xff1a; 红的蓝的绿的橙的…&#xff0c;可以说&#xff0c;留给它的color不多了。 那么商业BI到服务监控、从云托管到云协作&#xff…

短剧App开发的全攻略

短剧App开发的全攻略可以概括为以下几个关键步骤&#xff1a; 1、市场调研与需求分析 进行市场调研&#xff0c;研究目标用户群体&#xff0c;了解他们的需求和偏好。 观察竞争对手的App&#xff0c;分析他们的优点和缺点&#xff0c;以此为基础来制定自己的开发计划。 确定App…

Zookeeper节点ACL权限设置—digest模式

ACL全称为Access Control List&#xff08;访问控制列表&#xff09;&#xff0c;用于控制资源的访问权限。ZooKeeper使用ACL来控制对其znode&#xff08;ZooKeeper数据树的数据节点&#xff09;的访问。 zk利用ACL策略控制节点的访问权限: CREATE c 可以创建子节点 DELETE …

3D打印随形水路在注塑生产中的显著优势

3D打印技术在模具制造中已崭露头角&#xff0c;特别是在注塑生产中&#xff0c;3D打印随形水路的应用正变得日益普遍。 首先&#xff0c;该技术能精准优化模具温度。3D打印随形水路随形冷却的设计让模具温度更加均匀&#xff0c;水路更贴近产品&#xff0c;有效提升产品品质和缩…

k8s如何使用 HPA 实现自动扩展

使用Horizontal Pod Autoscaler (HPA) 实验目标&#xff1a; 学习如何使用 HPA 实现自动扩展。 实验步骤&#xff1a; 创建一个 Deployment&#xff0c;并设置 CPU 或内存的资源请求。创建一个 HPA&#xff0c;设置扩展策略。生成负载&#xff0c;观察 HPA 如何自动扩展 Pod…

redis实战-缓存穿透问题及解决方案

定义理解 缓存穿透&#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远都不会生效&#xff08;只有数据库查到了&#xff0c;才会让redis缓存&#xff0c;但现在的问题是查不到&#xff09;&#xff0c;会频繁的去访问数据库。 解决…

系统运维面试总结(系统权限)

系统运维面试总结&#xff08;系统权限&#xff09; 一、权限优化简述Linux权限划分原则二、备份策略三、Raid四、资源查看五、Linux启动流程 一、权限优化简述Linux权限划分原则 ckhunter也是一款常用的Linux杀毒软件 不可修改但可删除 二、备份策略 供参考较为全面的备份方案…

【Redis】SpringBoot连接Redis

1. 创建项目并配置文件 勾选NoSQL中的 Spring Data Redis。当然,把 Web 中的 SpringWeb 也勾选一下.方便写接口进行后续测试。 在 application.yml 中配置 2. 不同数据类型使用Demo 在SpringBoot中&#xff0c;为我们提供了StringRedisTemplate类&#xff0c;供我们处理一些文…