【发布时间】:2019-12-31 18:05:42
【问题描述】:
这篇文章让我很兴奋:https://stackoverflow.com/a/57674631/2492801,我考虑使用-fno-math-errno。但我想确保我不会损害我正在开发的软件的行为。
因此,我检查了(相当大的)代码库以查看errno 的使用位置,并且我想确定这些用法是否会干扰-fno-math-errno。但是怎么做呢?文档说:
-fno-math-errno
在调用使用单条指令执行的数学函数后不要设置 errno,例如 sqrt...
但是我怎么知道哪些数学函数是用一条指令执行的呢?这是在某处记录的吗?在哪里?
似乎我使用的代码库依赖于errno,尤其是在调用strtol 和处理流时。我猜strtol 不是用一条指令执行的。它是否被认为是一个数学函数?我怎么能确定?
【问题讨论】:
-
您对此类内容的第一个 goto 应该是 cppreference
-
@NathanOliver 我已经检查过了。我找不到任何提示
strtol是用一条指令执行还是被认为是一个数学函数。我也找不到使用单条指令执行的数学函数列表。你能给我更多的提示吗? -
我们一般无法知道实现,所以您实际上必须检查您的实现。您可以做的是使用它来获取设置
errorno的函数列表。此外,strtol使用整数数学,而不是浮点数学,因此可以免除。 -
您评论的第二部分似乎是正确的。我帖子中 gcc 文档的引文在下面一行说明:“以下选项控制关于浮点运算的编译器行为。”因此
strtol是安全的。但是前两句我看不懂。对于我检查过的来自<cmath>的所有函数,cppreference 声明:“错误按照 math_errhandling 中的指定报告。”但我仍然不知道它们是否是用一条指令执行的。那么你的建议是什么?阅读实现源代码? -
@BenjaminBihler -- 这是不符合标准的行为,因此标准要求的文档(例如 cppreference)对您没有帮助。你被编译器给你的任何文档困住了。
标签: c++ gcc compiler-optimization errno math-functions