gpt4 book ai didi

c++ - 类型转换是否会消耗额外的 CPU 周期

转载 作者:IT老高 更新时间:2023-10-28 12:47:07 45 4
gpt4 key购买 nike

C/C++ 中的类型转换会导致额外的 CPU 周期吗?

我的理解是,至少在某些情况下应该消耗额外的 CPU 周期。就像从浮点类型转换为整数一样,CPU 需要将浮点结构转换为整数。

float a=2.0;
int b= (float)a;

我想了解它会/不会消耗额外 CPU 周期的情况。

最佳答案

我想说的是“类型之间的转换”是我们应该关注的,而不是是否有强制转换。例如

 int a = 10;
float b = a;

将等同于:

 int a = 10;
float b = (float)a;

这也适用于更改类型的大小,例如

 char c = 'a';
int b = c;

这将“将 c 从单个字节扩展为 int 大小[使用 C 意义上的字节,而不是 8 位意义上的]”,这可能会添加在数据移动本身之上和之外的额外指令(或所用指令的额外时钟周期)。

请注意,有时这些转换并不明显。在 x86-64 上,一个典型的例子是使用 int 而不是 unsigned int 作为数组中的索引。由于指针是 64 位的,因此需要将索引转换为 64 位。在无符号的情况下,这很简单——只需使用值已经存在的寄存器的 64 位版本,因为 32 位加载操作会将寄存器的顶部填充为零。但如果你有一个 int,它可能是负数。因此编译器将不得不使用“符号将此扩展到 64 位”指令。这通常不是基于固定循环计算索引并且所有值都是正数的问题,但是如果您调用一个不清楚参数是正数还是负数的函数,编译器肯定会扩展该值.同样,如果一个函数返回一个用作索引的值。

但是,任何相当称职的编译器都不会盲目地添加指令以将某些内容从其自己的类型转换为自身(如果关闭优化,它可能会这样做 - 但最小优化应该看到“我们正在从类型 X 转换为类型 X,那不代表什么,让我们把它拿走”)。

因此,简而言之,上面的示例不会增加任何额外的惩罚,但肯定存在“将数据从一种类型转换为另一种类型确实会为代码添加额外的指令和/或时钟周期”的情况。

关于c++ - 类型转换是否会消耗额外的 CPU 周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16539412/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com