隐式浮点转换的编译时和运行时成本

时间:2014-03-27 08:04:06

标签: c gcc clang implicit-conversion

我们说我有以下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)似乎有点矫枉过正),但如果转换发生在编译时,那么上述任何方法之间肯定没有区别吗?

1 个答案:

答案 0 :(得分:1)

你可以很简单地检查这些事情。使用调试信息将您的示例编译为目标文件,并运行objdump以反汇编它并显示程序集以及C源代码:

cc -g -c example.c
objdump -dS example.o

为您的示例执行此操作表明,即使没有优化,每个变体也会生成完全相同的汇编代码。