C++新特性“CPU优化对齐”

哈喽 各位读者伙伴大家好 本篇文章讲一下C++新特性 alignas&alignof

在这之前 我们大家应该先了解一下数据对齐的问题

什么是数据对齐问题呢?

以下是两个结构体在内存中的分布图:

为什么要数据对齐呢? 首先是CPU  电脑中的CPU(单核或者多核)对数据对齐有着迫切的追求  一个好的字节长度 可以让CPU运行起来更加的轻松  不好的对齐只会让程序运行的速度减慢 甚至抛出错误

一向以高性能著称的C++语言 早在C++11之前就已经出了控制数据对齐的方法  我现在来介绍几个:

使用宏来获取数据对齐长度:

#include<cstddef>
#define ALIGNOF(type,result) \
struct type##_alignof_trick  \
{                            \char c;                  \type member;             \
};                           \
result=offsetof(type##_alignof_trick,member);
int main()
{int x1=0;ALIGNOF(short, x1);return 0;
}

这段代码看起来比较抽象 难以理解 我来介绍一下:

1.<cstddef>头文件

是C++标准库中的头文件,其中包含了一些与大小和指针相关的类型和函数定义。主要包括以下内容:

  1. std::size_t:无符号整数类型,用于表示对象的大小或数组的元素数量。
  2. std::ptrdiff_t:带符号整数类型,用于表示指针之间的差值。
  3. 空指针常量(nullptr):用于表示空指针。
  4. offsetof 宏:用于获取结构体成员相对于结构体起始地址的偏移量。

此外,该头文件还可能包含其他与指针、数组和内存操作相关的常量、宏和函数定义。

2. type##_alignof_trick

type##_alignof_trick 是一个宏定义中的技巧,通常用于在不支持 alignof 运算符的旧版本编译器中获取类型的对齐值。这种技巧通过创建一个包含指定类型的成员变量的结构体,并使用 offsetof 宏来计算其偏移量,从而间接地得到类型的对齐值。

3.结构体部分

结构体里面有有一个字符型成员 c 和待测类型的成员变量 member

4.\符号

反斜杠(\)被用作换行符的续行符它允许将一个长的宏定义分成多行以提高可读性。

在C和C++中,反斜杠后面跟着一个换行符会告诉编译器将该宏定义延续到下一行。这样可以将较长的宏定义分解为更易于阅读和理解的多个部分。

在这个代码中使用了多个反斜杠来将ALIGNOF宏定义拆分成多行,并确保每行结尾处没有意外的空格或其他字符。这有助于提高代码的可读性和维护性。

如果不能使用正确的\ 就会报错

C++11标准之前获取厂商的对齐长度:

在MSVC中,可以使用__alignof关键字来获取数据类型的对齐长度。例如,要获取整型变量的对齐长度,可以使用以下代码:

#include <iostream>int main() {std::cout << __alignof(int) << std::endl;return 0;
}

GCC

在GCC中,可以使用__alignof__关键字来获取数据类型的对齐长度。例如,要获取整型变量的对齐长度,可以使用以下代码:

#include <iostream>int main() {std::cout << __alignof__(int) << std::endl;return 0;
}

C++11 统一控制数据对齐长度的方法了

alignof运算符用于获取给定类型的对齐要求(以字节为单位)。以下是alignof运算符的使用示例:

#include <iostream>struct MyStruct {int a;char b;
};int main() {std::cout << alignof(int) << std::endl;       // 输出:4 (整型的对齐要求通常是4字节)std::cout << alignof(char) << std::endl;      // 输出:1 (字符类型的对齐要求通常是1字节)std::cout << alignof(double) << std::endl;    // 输出:8 (双精度浮点数的对齐要求通常是8字节)MyStruct obj;std::cout << alignof(MyStruct) << std::endl;  // 输出:4 (结构体MyStruct的对齐要求根据其中成员的最大对齐要求而定)return 0;
}

注意alignof运算符不能够测量对象的对齐长度 要想测量对象的对齐长度 使用编译器厂商提供的方法

alignas说明符定义结构体对齐长度 

说明 结构体类型的对齐字节长度 总是要大于或者等于结构体成员的对齐长度 如果小于则声明失效  

以下为代码实例:

#include <iostream>struct alignas(16) AlignedStruct {int a;char b;
};int main() {alignas(8) int alignedInt;  // 将整型alignedInt的对齐要求设置为8字节alignas(double) char alignedCharArray[16];  // 将字符数组alignedCharArray的对齐要求设置为double的对齐要求std::cout << alignof(alignedInt) << std::endl;     // 输出:8 (alignedInt的对齐要求)std::cout << alignof(alignedCharArray) << std::endl;   // 输出:8 (alignedCharArray的对齐要求)AlignedStruct obj;std::cout << alignof(obj) << std::endl;   // 输出:16 (结构体AlignedStruct的对齐要求)return 0;
}

总结:alignas为设置对齐字节长度  alignof为获取字节对齐长度 使用这两个函数 可以人为设置字符对齐字节长度 对CPU的优化达到最大 也可以进行跨平台操作 这在嵌入式linux的应用中显得尤为重要

好了 本篇文章就到这里结束了 在这里 小编向大家推荐一个课程地址:

https://xxetb.xetslk.com/s/2PjJ3T

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

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

相关文章

opencv mat用法赋值克隆的操作和一些基本属性

//Mat基本结构 (头部 数据部分) //赋值的话 就是修改了指针位置 但还是指向了原来数据 并没创建数据 本质上并没有变 //只有克隆或者拷贝时 它才会真正复制一份数据 //代码实现 //创建方法 - 克隆 //Mat m1 src.clone(); //复制 //Mat m2; //src.copyTo(m2); //赋值法 …

2023 IoTDB Summit:华润电力技术研究院副院长郭为民《新型时序数据库在智能发电领域的应用探索与展望》...

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

备战蓝桥杯---组合数学基础1

让我们来几道高中的组合题吧&#xff1a; 1.我们一定有n个向下&#xff0c;为 2.我们挑最大的两个&#xff0c;条件是他们奇偶性相同&#xff0c;为2*A10,2; 3.用捆绑法即可。 4.我们用隔板法&#xff0c;为 5.问题等价于23个相同的球放到3个盒子里&#xff0c;每个盒子至少…

Python 中的异步编程:提升程序性能的利器

随着互联网应用的迅猛发展&#xff0c;越来越多的应用程序需要处理大量的并发请求。传统的同步编程模型在处理大量并发请求时往往效率低下&#xff0c;造成程序响应速度变慢。为了解决这个问题&#xff0c;Python 提供了异步编程这一强大的工具&#xff0c;可以在单线程环境下实…

BKP寄存器与RTC实时时钟

BKP寄存器 BKP寄存器简介 BKP&#xff08;Backup Registers&#xff09;备份寄存器 BKP可用于存储用户应用程序数据。当VDD&#xff08;2.03.6V&#xff09;电源被切断&#xff0c;他们仍然由VBAT&#xff08;1.83.6V&#xff09;维持供电。当系统在待机模式下被唤醒&#xf…

Vue核心基础3:计算属性和监视属性

1 计算属性 这边以姓名案例&#xff0c;来介绍计算属性 <body><div id"root"><!-- 姓&#xff1a;<input type"text" v-model:value"firstName"><br>名&#xff1a;<input type"text" v-model:value&…

立体视觉几何 (三)

立体视觉系统概述 误差分析 考虑对应于深度 Z 的视差 d 的匹配对。我们想要评估 ΔZ&#xff0c;即视差误差引起的深度误差。将 Z 对 d 求导&#xff0c;得到&#xff1a; 立体视觉中基线&#xff08;baseline&#xff09;、焦距&#xff08;focal length&#xff09;和立体重…

黑马程序员——html css基础——day10day11day12——小兔鲜儿

目录&#xff1a; 底部盒子制作 底部服务模块制作底部帮助模块底部版权模块banner-轮播图 HTML结构CSS样式banner图片模块 htmlcssbanner小圆点制作 htmlcssbanner-侧导航 HTML结构CSS样式新鲜好物-hd HTML结构CSS样式新鲜好物-bd HTML结构CSS样式溢出文字显示省略号人气推荐 …

每日五道java面试题之java基础篇(三)

第一题. switch 是否能作⽤在 byte/long/String 上&#xff1f; Java5 以前 switch(expr)中&#xff0c;expr 只能是 byte、short、char、int。从 Java 5 开始&#xff0c;Java 中引⼊了枚举类型&#xff0c; expr 也可以是 enum 类型。从 Java 7 开始&#xff0c;expr 还可以…

《UE5_C++多人TPS完整教程》学习笔记9 ——《P10 创建会话(Creating A Session)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P10 创建会话&#xff08;Creating A Session&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

windows@命令行映射磁盘驱动器若干方法

文章目录 windows映射网络磁盘驱动器资源管理器中GUI方式创建命令行方式创建命令行列出驱动器列表删除取消映射持久化配置映射&#x1f47a;记住凭证 FAQ登录后自动挂载&#x1f47a;[以alist webdav 挂载为例]分析对策Note 访问已经挂载网络磁盘分区&#x1f47a;连接到局域网…

windows 下安装gin

go install 执行命令&#xff0c;执行不了的参考一下 https://blog.csdn.net/weixin_42592326/article/details/135946806 Golang 中没法下载第三方包解决办法-CSDN博客 go install github.com/gin-gonic/ginlatest 还是安装不了的话&#xff0c;用手机开热点&#xff0c;电…

第五篇:MySQL常见数据类型

MySQL中的数据类型有很多&#xff0c;主要分为三类:数值类型、字符串类型、日期时间类型 三个表格都在此网盘中&#xff0c;需要者可移步自取&#xff0c;如果觉得有帮助希望点个赞~ MySQL常见数据类型表 数值类型 &#xff08;注&#xff1a;decimal类型举例&#xff0c;如1…

大数据Doris(六十五):基于Apache Doris的数据中台2.0

文章目录 基于Apache Doris的数据中台2.0 一、​​​​​​​架构升级

iOS AlDente 1.0自动防过充, 拯救电池健康度

经常玩iOS的朋友可能遇到过长时间过充导致的电池鼓包及健康度下降问题。MacOS上同样会出现该问题&#xff0c;笔者用了4年的MBP上周刚拿去修了&#xff0c;就是因为长期不拔电源的充电&#xff0c;开始还是电量一半的时候不接电源会黑屏无法开机&#xff0c;最后连着电源都无法…

分享88个时间日期JS特效,总有一款适合您

分享88个时间日期JS特效&#xff0c;总有一款适合您 88个时间日期JS特效下载链接&#xff1a;https://pan.baidu.com/s/16UhIi4d42AkUN5uj2oGFFw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;…

AlmaLinux右键菜单(基于GNOME桌面)

文章目录 前言前提说明在文件上右键在文件夹上右键 前言 在使用VSCode的过程中&#xff0c;AlmaLinux没能像Windows一样在右键菜单上显示打开方式&#xff0c;所以找了一下解决方案&#xff0c;罗列出来 前提说明 虽然说无论是media还是StackOverflow都推荐使用这条命令&…

【MySQL基础】:深入探索DQL数据库查询语言的精髓(上)

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. DQL1.1 基本语法1.2 基础查询1.3 条件查询1.3 聚合函数 &#x1f324;️ 全篇…

mysql、mybatis中SORT

SORT排序 根据数据表sys_series中HOT&#xff08;int类型&#xff09;进行升序排列&#xff1a; 原来的数据库中存储&#xff1a; 排序 # 结果是HOT字段为null的所有数据都排在最前面&#xff0c;不为null的数据按升序排列 SELECT * FROM sys_series ORDER BY HOT;# 结果是H…

春节假期:思考新一年的发展思路

春节假期是人们放松身心、享受家庭团聚的时刻&#xff0c;但除了走亲戚、玩、吃之外&#xff0c;我们确实也需要思考新的一年的发展思路。以下是一些建议&#xff0c;帮助您在春节假期中为新的一年做好准备&#xff1a; 回顾过去&#xff0c;总结经验&#xff1a;在春节期间&a…