我们说我有以下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)
似乎有点矫枉过正),但如果转换发生在编译时,那么上述任何方法之间肯定没有区别吗?
答案 0 :(得分:1)
你可以很简单地检查这些事情。使用调试信息将您的示例编译为目标文件,并运行objdump以反汇编它并显示程序集以及C源代码:
cc -g -c example.c
objdump -dS example.o
为您的示例执行此操作表明,即使没有优化,每个变体也会生成完全相同的汇编代码。