C++性能优化笔记-6-C++元素的效率差异-7-类型转换

这篇具有很好参考价值的文章主要介绍了C++性能优化笔记-6-C++元素的效率差异-7-类型转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

类型转换

在C++语法中,有几种方式进行类型转换:

// Example 7.19
int i; float f;
f = i; 						// Implicit type conversion
f = (float)i; 				// C-style type casting
f = float(i); 				// Constructor-style type casting
f = static_cast<float>(i); 	// C++ casting operator

这些不同的方法有完全相同的效果。使用哪种方法是一个编程风格的问题。下边讨论下不同转换的时间损耗。

signed与unsigned转换

。。。
有符号与无符号整数间的转换只是让编译器以不同的方式解释整数的比特。不检查溢出,代码不需要额外时间。

整数大小转换

int i; short int s;
i = s;

一个整数转换成一个位数更长的整数时,如果是有符号的,通过扩展符号位,如果是无符号的,通过零扩展。如果是一个算术表达式的结果进行,通常需要1时钟周期。如果从内存读取一个变量的值来转换,通常不需要额外时间,如下:
。。。
将整数转换到更小的类型仅仅是忽略高位比特,不检查溢出。例如:
。。。
这个转换不需要额外时间。它只是保存32位整数的低16位。

浮点精度转换

在使用浮点寄存器栈时,float、double与long double间的转换不需要额外时间。在使用XMM寄存器时,需要2到15时钟周期(取决于处理器)。例子:

// Example 7.24
float a; double b;
a += b;

在这个例子中,如果使用XMM寄存器,转换是相对低效的。a与b应该是相同类型以避免。

整数到浮点转换

有符号整数到float或double的转换需要4 ~ 6时钟周期,取决于处理器与使用的寄存器类型。无符号整数的转换需要更长时间,除非AVX512指令集可用(AVX512DQ用于64bit无符号整数)。如果没有溢出的危险,首先把无符号整数转换到有符号整数会更快的:
。。。

浮点到整数转换

浮点值到整数的转换需要非常长的时间,除非启用SSE2或更新的指令集。通常,转换需要50 ~ 100时钟周期。原因是C/C++标准指定截断,因此浮点取整模式必须改变为截断,再改回来。

如果在代码的关键部分存在浮点到整数转换,那么对进行优化是重要的。可能的方案有:

  • 使用不同类型的变量,避免转换。
  • 将中间结果保存为浮点类型,将转换移出最里层循环。
    。。。

指针类型转换

指针可以被转换到另一个类型的指针。类似的,指针可以转换到整数,或者整数可以转换到指针。整数有足够的bit位保存指针是重要的。
这些转换不会产生额外的代码。它只是以不同的方式解释相同比特,或者绕过语法检查。
当然,这些转换不安全。确保结果有效是程序员的责任。

重新解释对象的类型

通过转换地址类型,使编译器将一个变量或对象当做另一个类型是可能的:

float x;
*(int*)&x |= 0x80000000;	// Set sign bit of x

这里,语法看起来有些奇怪。x 的地址被类型转换为一个整数指针,然后通过把x当做整数访问。实际上制作一个指针,编译器不产生任何额外的代码真正创造一个指针。这个指针只是被优化掉,结果x被处理为一个整数。但 & 操作符强制编译器在内存而不是寄存器里保存x。上面例子通过使用只能应用于整数的 | 操作符设置 x 的符号位。它比x = -abs( x );更快。

在类型转换指针时,要小心一些风险:

  • 违反严格的标准C别名规则,尤其是不同类型的两个指针不能指向相同的对象(除了char指针)。优化编译器可能在两个不同的寄存器中保存浮点与整数表示。你需要检查编译器的行为是否就是你所期望的。使用联合更安全。
  • 如果对象被当做比其实际更大的类型对待,该技巧会无效。上面这个代码将出错,如果int比float使用更多比特。(在x86系统里,两者都使用32比特)。
    。。。

const_cast

const_cast用于去除一个指针的const限制。它有一些语法检查,因此,比C风格的类型转换更安全,无需添加任何额外的代码。例如:
。。。

static_cast

static_cast操作符做的与C形式的类型转换相同。

reinterpret_cast

reinterpret_cast操作符用于指针转换。与c风格的转换类似,但会进行一些语法检查,不产生任何额外的代码。

dynamic_cast

dynamic_cast操作符用于将一个类指针转换为另一个类的指针。它对转换的有效性进行运行时检查。例如,在一个基类指针被转换为派生类的指针时,它检查原始指针是否真的指向派生类的一个对象。这个检查使得dynamic_cast比简单的类型转换更耗时些,但也更安全。它可能捕捉到原本没发现的编程错误。

转换类对象

涉及类对象的转换(而不是对象指针)是看可能的,只要程序员定义了说明如何进行这个转换的一个构造函数、一个重载赋值操作符或一个重载类型转换操作符。构造函数或重载操作符与成员函数效率相同。

欢迎交流
xmm转换,c++,程序优化,c++,性能优化文章来源地址https://www.toymoban.com/news/detail-775912.html

到了这里,关于C++性能优化笔记-6-C++元素的效率差异-7-类型转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android开发实战经典,设计思想与代码质量优化+程序性能优化+开发效率优化

    一、关于Handler面试那些问题 1、Handler Looper Message 关系是什么? 2、Messagequeue 的数据结构是什么?为什么要用这个数 据结构? 3、如何在子线程中创建 Handler? 4、Handler post 方法原理? 5、Android 消息机制的原理及源码解析 6、Android Handler 消息机制 7、Android 消息机制 … 二、关于

    2024年03月11日
    浏览(77)
  • 助你加速开发效率!告别IDEA卡顿困扰的性能优化技巧

    在现代软件开发中,IDE(集成开发环境)是一个必不可少的工具。IntelliJ IDEA是一个广受欢迎的IDE,但有时候IDE的性能可能会受到影响,导致开发人员的工作效率降低。本文将介绍一些可以提高IDE性能的技巧,帮助开发人员消除卡顿困扰。 优化IDE的配置 在IDEA中,可以通过修改

    2024年01月25日
    浏览(40)
  • Rust 性能优化 : Rust 性能优化技巧,提升 Rust 程序的执行效率和资源利用率 The Rust Performance

    作者:禅与计算机程序设计艺术 在过去的几年中,随着编程语言的快速发展,编程人员已经逐渐从依赖编译型语言转向了使用解释型语言。相对于编译型语言来说,解释型语言具有更快的执行速度,在某些情况下甚至可以实现接近编译器的运行时效率。但是另一方面,这些语

    2024年02月07日
    浏览(44)
  • JVM逃逸分析原理解析:优化Java程序性能和内存利用效率

    在Java开发中,性能和内存利用效率一直是开发者关注的焦点。为了提高Java程序的执行效率,JVM引入了逃逸分析技术。本文将详细解析JVM逃逸分析的原理,帮助读者深入理解其工作机制。 逃逸分析是一种用于确定对象在方法的生命周期内是否逃逸出方法外部范围的技术。在

    2024年01月20日
    浏览(40)
  • C++中vector和数组之间的转换及其效率问题

    因为一些原因,本人遇到需要频繁把vector与数组之间转换的情况,于是就分析了一下两个之间转换的实施以及相关的效率问题。 众所周知,一维vector中的元素存储是顺序连续的,所以我们可以通过访问第一个元素的地址以及元素的数量来访问一系列的元素。因此,我们可以采

    2023年04月09日
    浏览(30)
  • C#正则表达式性能优化:[0-9] vs. \d,轻松提升匹配效率

      概述: 在C#中,正则表达式`d`相对于`[0-9]`可能效率稍低,因为`d`包含更广泛的Unicode数字字符。为提高性能,可使用`[0-9]`并结合编译优化。以下示例演示性能测试及优化,适用于提高正则表达式匹配效率的场景。 在C#中,正则表达式 d 涵盖更广泛的 Unicode 数字字符范围,

    2024年04月11日
    浏览(30)
  • 使用Elasticsearch进行数据类型转换优化

    在本文中,我们将探讨如何使用Elasticsearch进行数据类型转换优化。Elasticsearch是一个强大的搜索和分析引擎,它可以处理大量数据并提供实时搜索功能。然而,在处理数据时,我们可能需要对数据类型进行转换,以便更有效地存储和查询数据。 Elasticsearch是一个基于Lucene的搜索

    2024年02月21日
    浏览(31)
  • 我的C++奇迹之旅:值和引用的本质效率与性能比较

    引用 不是新定义一个变量,而是给 已存在变量取了一个别名 ,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 定义: 类型引用变量名(对象名) = 引用实体; 例如以下代码,在变量名前加一个 ,意思是一个引用类型, b 是 a 的别名,也就是

    2024年04月27日
    浏览(46)
  • React【性能优化_shouldComponentUpdate、性能优化_时间分片、性能优化_虚拟列表、PropTypes 进行类型检查、默认 Prop 值、 TypeScript】(六)

    目录 性能优化_shouldComponentUpdate 性能优化_时间分片 性能优化_虚拟列表

    2024年02月08日
    浏览(43)
  • 【C++】C++的类型转换

    在 C 语言中,如果 赋值运算符左右两侧类型不同 ,或者 形参与实参类型不匹配 ,或者 返回值类型与 接收返回值类型不一致 时,就需要发生 类型转化 。 C 语言中总共有两种形式的类型转换: 隐式类型 转换和显式类型转换 。 隐式类型转化:编译器在编译阶段自动进行,能

    2024年01月19日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包