gpt4 book ai didi

c++ - 元编程中有哪些数学运算符可用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:49 25 4
gpt4 key购买 nike

在 Todd Veldhuizen 的 metaprogramming guide 中看到最后一个例子给我留下了深刻的印象其中像 sincos 这样的三角函数是在编译时预先计算的。老实说,这让我大吃一惊,如果您像我一样正在编写循环执行大量此类操作的代码,那么这可能会对提高性能产生重大影响。

问题 1

然而,这让我想知道作为运行时工具(调用实际数学库函数,如 sincos)之间的界限在哪里以及仅作为编译时数学运算符可用的内容。

Todd 的示例需要使用普通算术手动计算三角函数。

那么我是否假设编译器能够处理所有普通的数学函数 * + - /但没有别的吗?

问题 2

在这种情况下,您只能获得整数的 sincos 计算的编译时结果,对吗?也就是说,您不能预编译类似 sin 45.5 的结果,对吗?

或者如果模板只能接受整数作为参数,您可以取几个整数并在类中用它们制作一个float,比如传递1 2 3 并使 1.23 得到浮点值的 sin

最佳答案

Question 1

However, it led me to wonder where the line is drawn between what is available as a run-time tool (calling actual math library functions like sin or cos) and what is available as only a compile-time mathematical operator.

  • 如果命名函数声明为 constexpr,则它们只能在编译时使用,遵守 constexpr 的规则并使用编译时常量调用。
  • 只有通过 constexpr 构造函数从编译时常量构造用户定义的数据类型,才能在编译时使用它们。
  • 任何对编译时常量内置类型进行操作的内置运算符都会给出一个编译时常量。
  • 如果原始函数是编译时常量,则内置函数之间的任何类型转换都会给出一个编译时常量。

因此,它不仅限于四个数学运算符,您还可以使用 % 和其他运算符,以及模板元函数和 constexpr 表达式。

Question 2

In such a case, you'd only be able to get compile-time results for sin and cos calculations on whole numbers, right? That is, you cannot pre-compile the result of something like sin 45.5, correct?

是也不是。在 C++03 中,您只能使用内置函数和模板元函数,constexpr 不可用。 sin 因此必须是一个模板元函数,它只能作用于整型常量,因为浮点类型在模板中是不允许的。但是,您可以为分数或定点值定义模板,并为它们提供一个 sin 模板。但这会非常乏味,而且您很容易遇到模板实例化限制。

从 C++11 开始,您可以编写采用浮点参数并使用这些参数的 constexpr 函数。

关于c++ - 元编程中有哪些数学运算符可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16766579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com