在代码库中,我经常看到人们写作
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 ++以隐藏的规则和陷阱而闻名,这意味着直觉有时候是不对的,那么为什么它会被推翻以问这样的问题呢?
答案 0 :(得分:8)
你是对的,0
是int
,不是双(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
乘以浮点数。差异很重要 - 您可以将一种类型的编译时常量转换为另一种类型的常量,也可以使用这些类型的计算。