我有一个很长的公式,如下所示:
float a = sin(b)*cos(c)+sin(c+d)*sin(d)....
有没有办法在 C 中使用 s
而不是 sin
来缩短公式,而不影响运行时间?
最佳答案
对于sin
,至少有三种使用s
的选项:
使用预处理器宏:
#define s(x) (sin(x))
#define c(x) (cos(x))
float a = s(b)*c(c)+s(c+d)*c(d)....
#undef c
#undef s
请注意,使用 #undef
会立即删除宏定义,以防止它们影响后续代码。此外,您应该了解预处理器宏替换的基础知识,注意 c(c)
中的第一个 c
将被扩展,但第二个 c
不会,因为类函数宏 c(x)
仅在 c
后跟 (
的地方展开。
此解决方案不会影响运行时间。
使用内联函数:
static inline double s(double x) { return sin(x); }
static inline double c(double x) { return cos(x); }
对于一个好的编译器,这对运行时没有影响,因为编译器应该用直接调用 来代替对
或 s
或 c
的调用sincos
,结果与原代码相同。不幸的是,在这种情况下,c
函数将与您在示例代码中显示的 c
对象发生冲突。您将需要更改其中一个名称。
使用函数指针:
static double (* const s)(double) = sin;
static double (* const c)(double) = cos;
对于一个好的编译器,这也不会对运行时间产生影响,尽管我怀疑与以前的解决方案相比,使用该解决方案的编译器可能无法优化代码。同样,您的名称将与 c
冲突。请注意,使用函数指针会创建对 sin
和 cos
函数的直接调用,绕过 C 实现可能为它们定义的任何宏。 (允许 C 实现使用宏和函数来实现库函数,它们可能这样做是为了支持优化或某些特性。使用高质量的编译器,这通常是一个小问题;直接调用的优化仍然应该很好.)
关于我可以缩短我重复使用的函数名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54328965/