硬编码的数学运算是在 Xcode 中的 Objective-C 编译时或运行时执行的吗?

jon*_*ley 3 optimization xcode objective-c clang ios

如果我为数学运算编写一行代码,例如:

x = 109.0f*768.0f/320.0f;
Run Code Online (Sandbox Code Playgroud)

结果 (261.6f) 是在编译时还是运行时计算的?换句话说,Xcode 的优化是否认识到硬编码数学运算的结果将始终相同,因此可以在编译时预先计算?

rob*_*off 5

它是在编译时计算的,至少使用针对 iOS 的 Xcode。这个功能:

float test() {
    float x = 109.0f*768.0f/320.0f;
    return x;
}
Run Code Online (Sandbox Code Playgroud)

编译为这三个指令:

movw    r0, #52429
movt    r0, #17282
bx  lr
Run Code Online (Sandbox Code Playgroud)

C 标准不要求在编译时计算值。事实上,如果您设置了FENV_ACCESS编译指示,则在某些情况下会禁止在编译时计算它。FENV_ACCESS在此测试用例中打开并不影响生成的指令。