【发布时间】:2014-03-27 08:04:06
【问题描述】:
假设我有以下 C 结构:
typedef struct {
float a, b;
} Floats;
然后我有一个函数将创建这个结构的实例:
Floats createFloats(float aVal, float bVal) {
Floats f = {aVal, bVal};
return f;
}
现在基本上有 4 种可能的(句法)方式来创建相同的结构:
Floats f1 = createFloats(0.0f, 1.0f); // (A) [Canonical?]
Floats f2 = createFloats(0.0, 1.0); // (B)
Floats f3 = createFloats(0, 1); // (C)
Floats f4 = createFloats(((float)0), ((float)1)); // (D)
我的问题是,以上 4 种创建结构的方法在编译时和运行时有什么区别?具体来说,什么时候发生隐式浮点转换(比如 clang 和 gcc)。有人建议我不要使用(C)(而(D) 似乎有点过头了),但是如果转换发生在编译时,那么上述任何方法之间肯定没有区别吗?
【问题讨论】:
-
在 A 到 C 的情况下没有运行时转换,这一切都是在编译时完成的(就像情况 D 一样)。但是如果你真的想知道,检查生成的代码,这是唯一的知道的方法。
-
那么,程序集告诉你什么?
-
编译器不会隐式计算函数的返回值,除非你指定constexpr
标签: c gcc clang implicit-conversion