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

简介: 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

相关文章
|
2月前
|
存储 弹性计算 安全
阿里云轻量服务器通用型、CPU优化型、多公网IP型、国际型、容量型不同实例区别与选择参考
阿里云轻量应用服务器实例类型分为通用型、CPU优化型、多公网IP型、国际型、容量型,不同规格族的适用场景和特点不同,收费标准也不一样。本文为大家介绍轻量应用服务器通用型、多公网IP型、容量型有何区别?以及选择参考。
|
23天前
|
存储 缓存 数据挖掘
阿里云轻量应用服务器“CPU优化型”配置介绍、费用价格说明
阿里云轻量应用服务器推出CPU优化型,提供更强计算性能,2核4GB起,最高16核64GB,全系支持200Mbps带宽。适用于企业级应用、数据库、游戏服务器等高算力场景,保障稳定高效运行。
179 1
|
2月前
|
缓存 关系型数据库 MySQL
降低MySQL高CPU使用率的优化策略。
通过上述方法不断地迭代改进,在实际操作中需要根据具体场景做出相对合理判断。每一步改进都需谨慎评估其变动可能导致其他方面问题,在做任何变动前建议先在测试环境验证其效果后再部署到生产环境中去。
117 6
|
7月前
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
9月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
941 166
|
6月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
208 12
|
安全 编译器 程序员
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
235 2
|
7月前
|
存储 设计模式 监控
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
180 0
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
|
9月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
230 13
|
12月前
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
318 59

热门文章

最新文章

下一篇
oss教程