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://xiahunao.cn/news/2780462.html

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

相关文章

mac docker 宿主机和容器间网络打通

动因 是这样&#xff0c;笔者最近满怀欣喜入手Docker&#xff0c;看着各种文章命令都是不断点头称道&#xff1a;“嗯嗯&#xff0c;不错不错”,在接下来终于准备大干一场的时候碰壁了&#xff0c;主要情况是说在Mac中跑了第一把的时候发现碰到&#xff0c;虚拟机和宿主机居然…

LV.23 D1 ARM体系结构概述 学习笔记

一、必须要了解的ARM知识点 1、ARM公司简介 ARM&#xff08;Advanced RISC Machines&#xff09;有三种含义&#xff1a; 它是一个公司的名称、它是一类微处理器的通称、它是一种技术的名称。 2、ARM处理器家族 早先经典处理器 包括ARM7、ARM9、ARM11家族。 Corte…

【Java从入门到精通】Java变量类型

Java 变量类型 在 Java 语言中&#xff0c;所有的变量在使用前必须声明。 声明变量的基本格式如下&#xff1a; type identifier [ value][, identifier [ value] ...] ; 格式说明&#xff1a; type -- 数据类型。identifier -- 是变量名&#xff0c;可以使用逗号 , 隔开…

python-分享篇-GUI界面开发-PyQt5-对QListWidget列表进行数据绑定

代码 # -*- coding: utf-8 -*-# Form implementation generated from reading ui file bindlist.ui # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! 对QListWidget列表进行数据绑定from PyQt5 import QtCore, QtG…

为什么总有人觉得前端很简单?尤其是水平半瓶水的人。

造成这个印象的原因很多&#xff0c;贝格前端工场结合自己的经验&#xff0c;为大家揭开这个谜底。低端的前端确实简单&#xff0c;但是高级阶段确实不简单。 缺乏深入了解&#xff1a; 有些人可能只是对前端开发有一些浅显的了解&#xff0c;没有深入研究过前端开发的技术和知…

车载电子电器架构 —— 电子电气系统车载功能子系统

车载电子电器架构 —— 电子电气系统车载功能子系统 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠自己,…

数模.微分方程

或者可以建立一个是实时脚本&#xff0c;也可以转化成上图公式 solver只是一个代名词&#xff0c;代表的是后面七种函数的名字 百分之九十用ode45函数 注意df1是在另外一个文件里面 计算导弹追击问题没有记录&#xff0c;去文件找代码

板块一 Servlet编程:第二节 Servlet的实现与生命周期 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程&#xff1a;第二节 Servlet的实现与生命周期 一、Servlet相关概念Serlvet的本质 二、中Web项目中实现Servlet规范&#xff08;1&#xff09;在普通的Java类中继承HttpServlet类&#xff08;2&#xff09;重写service方法编辑项目对外访问路径 二、Servlet工…

392. Is Subsequence(判断子序列)

题目描述 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一个子…

【AI大模型应用开发】【LangChain系列】6. LangChain的Callbacks模块:监控调试程序的重要手段

大家好&#xff0c;我是【同学小张】。持续学习&#xff0c;持续干货输出&#xff0c;关注我&#xff0c;跟我一起学AI大模型技能。 LangChain提供了一个回调系统&#xff0c;允许您挂接到LLM应用程序的各个阶段。这对于日志记录、监视、流式传输和其他任务非常有用。 0. Lang…

02.数据结构

一、链表 作用&#xff1a;用于写邻接表&#xff1b; 邻接表作用&#xff1a;用于存储图或树&#xff1b; 1、用数组模拟单链表 #include<iostream> using namespace std;const int N 100010;// head 表示头结点的下标 // e[i] 表示结点i的值 // ne[i] 表示结点i的ne…

mac IDEA基础配置和激活+maven配置+scala插件导入+scala文件打包

文章目录 下载IDEA通过插件激活下载Maven在IDEA上配置Maven在IDEA上加载Scala插件在IDEA中创建Maven项目在IDEA上通过Maven打包scala文件 下载IDEA通过插件激活 IDEA从这里下载&#xff0c;下载首次登陆需要创建一个IntelliJ账号&#xff0c;登陆后点击start trail开启一个月的…

获IROS最佳移动操作论文提名|通研院提出首个实现连续操作任务的空中具身智能机器人CORVUS(渡鸦)

论文导读 本文介绍了通研院机器人实验室发表于2023年国际机器人顶级会议IROS上的论文&#xff0c;题为《Sequential Manipulation Planning for Over-actuated Unmanned Aerial Manipulators》[1]。文章介绍了一种可以实现空中全向平稳飞行的过驱动空间机械臂平台Coordinated …

###C语言程序设计-----C语言学习(12)#进制间转换,十进制,二进制,八进制,十六进制

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 计算机处理的所有信息都以二进制形式表示&#xff0c;即数据的存储和计算都采…

Python高级进阶--多线程爬取下载小说(基于笔趣阁的爬虫程序)

目录 一、前言 1、写在前面 2、本帖内容 二、编写代码 1、抓包分析 a、页面分析 b、明确需求 c、抓包搜寻 2、编写爬虫代码 a、获取网页源代码 b、提取所有章节的网页源代码 c、下载每个章节的小说 d、 清洗文件名 e、删除子文件夹 f、将下载的小说的所有txt文件…

【数学建模】【2024年】【第40届】【MCM/ICM】【F题 减少非法野生动物贸易】【解题思路】

一、题目 &#xff08;一&#xff09; 赛题原文 2024 ICM Problem F: Reducing Illegal Wildlife Trade Illegal wildlife trade negatively impacts our environment and threatens global biodiversity. It is estimated to involve up to 26.5 billion US dollars per y…

【数据库】Unlogged 表使用

【数据库】Unlogged 表使用 前言普通表和Unlogged 表的写性能比较普通表创建和数据插入Unlogged 表创建和数据插入比较结果 Unlogged 表崩溃和正常关闭测试Unlogged 表特点总结 前言 大神偶像在开会上提及了Unlogged 表&#xff0c;它的特点很不错&#xff0c;很适合实时数据保…

如何部署一个高可用的 Linux 集群?

部署一个高可用的 Linux 集群需要经过多个步骤和考虑因素。以下是一个简要的指南&#xff0c;帮助您了解如何部署一个高可用的 Linux 集群&#xff1a; 确定需求和目标&#xff1a;在开始部署之前&#xff0c;您需要明确高可用性的定义和目标。对于一些组织而言&#xff0c;高…

【51单片机】自定义动态数码管显示(设计思路&原理&代码演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 本章节内容为【实现动静态数码管】项目的第四个模块完整章节&#xff1a;传送门 欢迎订阅 YY滴C专栏&#xff01;更多干货持…

react函数组件中使用context

效果 1.在父组件中创建一个createcontext并将他导出 import React, { createContext } from react import Bpp from ./Bpp import Cpp from ./Cpp export let MyContext createContext(我是组件B) export let Ccontext createContext(我是组件C)export default function App…