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…

解决:bert_score无法加载本地模型

相信很多小伙伴平时都使用内网进行工作&#xff0c;这些网络是无法连接huggingface的&#xff0c;使用魔塔加载模型网络断断续续的很容易失败。但是bert_score只接收一个模型名&#xff0c;然后自动在huggingface下载或在本地缓存加载。这个缓存跟huggingface官方缓存是不同的。…

2710.移除字符串中的尾随0

从右到左&#xff0c;找到第一个不为0的&#xff0c;然后返回字符串前面的. class Solution { public:string removeTrailingZeros(string num) {int i num.length();while(true){if (num[i-1]0){i--;}else break;}return num.substr(0, i);} };调用函数&#xff0c;string.f…

最新源支付系统源码 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…

网络编程:使用UDP实现数据帧的接收

目录 1、需求 2、逻辑处理 3、代码实现 4、总结 1、需求 使用java代码实现数据帧的接收需求&#xff0c;完成数据到数据库的存储。 2、逻辑处理 由于udp传输不保证数据的有序性、可靠性&#xff0c;所以在做业务开发的时候&#xff0c;要程序员自己考虑需求完善udp的缺陷。…

广东省钟表行业协会第十二届会员大会暨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 设置子元素是否换行 …

同步的问题及解决方案

同步 同步的问题 当给狗狗食物的同时,狗狗又在吃,这会导致在运行过程中会出现食物的数据的错乱,有时候会多出数据,有时候会少出数据,这就让狗狗有时候会很吃亏,那么该如何解决呢? 实验体现 package multiThread2;public class Animal{private String name;private int…

电影票房预测管理系统设计

电影票房预测管理系统的开发涉及多个层面的设计&#xff0c;包括但不限于数据收集、数据分析、预测模型构建、用户界面设计和系统集成。以下是一个基本的系统设计框架&#xff1a; 1. 数据收集模块&#xff1a;这是整个系统的基础。需要收集的数据可能包括历史票房数据、上映电…

docker离线安装部署

docker离线安装部署 下载资源包 wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.0.tgzwget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.6.tgz安装 #1、解压dockertar -zxvf docker-24.0.6.tgz#2、将解压之后的docker文…

2024年6月GESP认证图形化编程_Python_C++真题及答案

2024年6月CCF GESP认证图形化编程_Python_C真题及答案 GESP 6月认证图形化编程一级真题 GESP 6月认证图形化编程二级真题 GESP 6月认证图形化编程三级真题 GESP 6月认证图形化编程四级真题 GESP 6月认证 C 一级真题 GESP 6月认证 C 二级真题 GESP 6月认证 C 三级真题 GE…

HTML 纯页面商城(简易版)

index.html ---- <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>购物商城</ti…

Memcached安装与配置:从零开始搭建高效缓存系统

Memcached 是一个高性能、分布式内存对象缓存系统&#xff0c;用于加速动态Web应用程序&#xff0c;减轻数据库负载。本文将详细介绍如何从零开始安装和配置Memcached&#xff0c;以搭建一个高效的缓存系统。 1. Memcached简介 Memcached 是一个开源的内存缓存系统&#xff0…

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

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