当前位置: 首页 > news >正文

C++性能相关的部分内容

C++性能相关的部分内容

与底层硬件紧密结合

大端存储和小端存储(硬件概念)
C++在不同硬件上运行的结果可能不同
比如:输入01234567,对于大端存储的硬件会先在较大地址上先进行存储,而对于小端存储的硬件会先在较小地址上进行存储
数据的高位部分存于高位字节,且在内存地址中,大端模式下高位字节存于低地址,小端模式下存于高地址
01234567(高位字节->低位字节)
内存地址(低地址->高地址)

大小端存储会对以下方面造成影响:
数据存储和读取

  • 对于多字节数据类型,如intfloat等,在不同大小端存储模式下,数据在内存中的存储顺序不同。大端模式下,数据的高位字节存于低地址,低位字节存于高地址;小端模式则相反。这就导致在读取数据时,如果程序没有考虑到硬件的大小端特性,可能会读取到错误的数据。例如,在一个小端模式的系统中存储了0x12345678,如果按照大端模式去读取,就会将其解读为0x78563412,与实际存储的值不同。
    网络通信
  • 在网络通信中,不同的设备可能采用不同的大小端存储方式。如果发送方和接收方的大小端设置不一致,就需要进行数据转换,否则会导致数据传输错误。例如,一台大端模式的计算机向一台小端模式的计算机发送一个int类型的数据0x12345678,接收方按照小端模式接收后,会将数据存储为0x78563412,与发送方发送的数据不一致。为了解决这个问题,网络协议通常会规定统一的字节序,如TCP/IP协议使用大端序(网络字节序),在发送数据时,发送方需要将数据转换为网络字节序,接收方收到数据后再转换为本地字节序。
    文件格式
  • 一些文件格式也会对数据的存储字节序有规定。例如,BMP图像文件格式规定使用小端序存储图像数据。如果在读取BMP文件时,没有按照小端序来解析数据,就无法正确读取图像的像素信息,导致图像显示错误。同样,在处理其他文件格式如音频文件、视频文件等时,也需要根据文件格式的规定来正确处理大小端问题,以确保能够正确地解析和处理文件中的数据。
    跨平台编程
  • 当编写跨平台的程序时,由于不同的硬件平台可能采用不同的大小端存储模式,程序员需要特别注意处理大小端问题,以确保程序在各种平台上都能正确运行。例如,在一个同时支持大端和小端平台的程序中,如果直接对多字节数据进行存储和读取,而没有考虑大小端差异,那么在不同平台上运行时可能会得到不同的结果。为了避免这种情况,程序员可以使用一些特定的函数或宏来进行大小端转换,或者采用一些与平台无关的方式来存储和处理数据,如使用网络字节序来存储和传输数据,在需要时再进行本地字节序的转换。

对象生命周期的精确控制

C++与C#的对象生命周期
1.C#语言中,对象使用完毕后由垃圾回收系统自动销毁,程序员无需关注销毁操作。
(易用性但由于额外引入垃圾回收系统这个额外机制而造成性能损耗)
2.C++中,对象的生命周期由程序员精确控制,包括构造和销毁。(程序员显式的做这件事)
3.这种设计差异主要取决于易用性和性能之间的取舍。

对象生命周期精确控制的好处
1.精确控制对象生命周期可以避免引入额外的垃圾回收系统,从而提升性能
2.及时释放对象资源可以使资源得到更有效的利用
3.通过编译器优化,某些语言特性在编译时执行,进一步提升了性能。

C++和C#的异常处理机制
1.C++中使用try-catch语句来处理异常,try语句体中构造的对象需要在抛出异常后显式销毁。
2.C#中使用try-catch-finally语句,try语句体中构造的对象无论是否抛出异常都会被销毁。(在Finally中被销毁)
3.这种差异源于C++对对象生命周期的精确控制。

左侧C++异常处理机制、右侧C#异常处理机制

对象生命周期精确控制的好处
1.精确控制对象生命周期可以避免引入额外的垃圾回收系统(占用额外的系统资源),从而提升性能。
2.及时释放对象资源可以使资源得到更有效的利用。
3.通过编译器优化,某些语言特性在编译时执行,进一步提升了性能。

Zero-Overhead Abstraction

理解Zero-Overhead Abstraction(零开销抽象)
在 C++ 编程中,C++ 有很多复杂的特性,像模板、多态等。当你写代码时,如果某个程序只用到了基本的数据类型和简单的函数,没用到模板特化或者复杂的多态机制,那程序在运行的时候,就不会因为这些没用到的特性,额外占用内存空间或者让运行速度变慢。也就是说,C++ 不会把那些你不用的特性所带来的开销,强加到你的程序上,这样能让程序更高效地运行

1.Zero Overhead Abstraction意味着不为未使用的语言特性支付成本。
2.虚函数会增加程序的运行时开销,但如果类中没有定义虚函数,则不支付虚函数的成本。
3.C++通过编译器优化,在编译时执行某些函数,避免了运行时的开销。

相关文章:

  • LABVIEW 通过节点属性动态改变数值显示控件的方法
  • 解决 cursor 中不能进入 conda 虚拟环境
  • 【HarmonyOS Next之旅】DevEco Studio使用指南(二十六) -> 创建端云一体化开发工程
  • Pycharm 和Flask 的学习心得(5-6)
  • 2.2.1 05年T2
  • SDL2常用函数:SDL_Surface 数据结构及使用介绍
  • 物联网网关保障沼气发电站安全运行的关键技术解析
  • Spring AI 之结构化输出转换器
  • 数据库与编程安全
  • Windows 配置 ssh 秘钥登录 Ubuntu
  • STM32F446主时钟失效时DAC输出异常现象解析与解决方案
  • ✨ PLSQL卡顿优化
  • 加州房价预测:基于 Python 的多元回归分析实践
  • 虚拟文件(VFS)
  • 代码混淆技术的还原案例
  • python网络爬虫的基本使用
  • ai陪伴项目——Android app开发
  • MySQL--day7--聚合函数
  • 多模态智能体架构
  • [Git] 如何进行版本回退
  • 建设网站对公司起什么作用/如何建立免费公司网站
  • 电子商务服务网站/旺道seo优化
  • 建设自己网站/实时新闻最新消息
  • 企业网站建设营销/seo点石论坛
  • 电子商务网站建设试卷及答案/网站建设制作流程
  • csgo翻硬币网站开发/百度指数搜索指数的数据来源