将unsigned int初始化为0?

时间:2017-04-27 15:39:23

标签: c++ c++11

在代码库中,我经常看到人们写作

void f(unsigned int){/* some stuff*/ }; // define f here
f(0) // call f later
unsigned int a = 0;
double d = 0;

初始化的数字(此处为0)与声明的类型不匹配让我烦恼,如果这是性能关键代码,这种初始化会不会影响性能?

修改 对于downvoters:

在我发布问题之前我做了搜索,c ++因隐藏规则而闻名,我不知道整数推广规则,直到有人在这个问题下发表评论。对于那些说'#34;即使是愚蠢的编译器在运行时没有进行转换",下面的例子来自this answer

 float f1(float x) { return x*3.14; }            
 float f2(float x) { return x*3.14F; }

这两个版本有不同的性能,对于一个没有经验的c ++程序员,我不会发现我的问题和这个例子之间存在很大差异。而且C ++以隐藏的规则和陷阱而闻名,这意味着直觉有时候是不对的,那么为什么它会被推翻以问这样的问题呢?

2 个答案:

答案 0 :(得分:8)

你是对的,0int,不是双(0.),也不是无符号 int。这在此并不重要,因为int可以隐式转换为这些类型,而0可以完全由两者表示。也没有表现影响;编译器在编译时完成所有操作。

答案 1 :(得分:6)

  

如果这是性能关键代码,这种初始化会不会影响性能?

非常不可能。即使没有启用任何优化,编译器也没有理由生成代码来获取原始值并转换为变量类型,而不是通过转换的该类型表示进行初始化(如果需要进行转换)。虽然如果你使用新风格,这可能会影响你的代码,有些人建议在现代C ++中使用

auto a = 0U; // if you do not specify U then variable type would be signed int

使用这种风格是否是一个主观问题。

您的补充:

float f1(float x) { return x*3.14; }            
float f2(float x) { return x*3.14F; }

这种情况完全不同。在第一种情况下,x被提升为double计算,使用double,然后结果转换为float,而在第二种情况下,float乘以浮点数。差异很重要 - 您可以将一种类型的编译时常量转换为另一种类型的常量,也可以使用这些类型的计算。