我想使用constexpr的标准版<cmath>一样的功能exp,log,pow在便携方式.我目前有一个非便携式解决方案g++将这些功能视为constexpr- 不兼容C++的扩展,但我担心可移植性和面向未来(我想这个扩展可能有一天会被删除g++).
我constexpr对这些函数的版本感兴趣,而不是模板元程序 - 我希望在编译时和运行时都可以使用相同的功能.我不需要C兼容性,但我确实需要快速实现 - 诸如Taylor Series扩展之类的天真实现会太慢.
我该如何实现这些功能?我在特别感兴趣exp,log和pow
我从研究中学到了一些切向相关的东西
constexpr因为它们必须具有副作用(例如设置errno)以保持C兼容性constexpr,但作为C++ 14,这是禁止的(每个第一回答这个问题和回答这个问题).这是我担心函数可能不会出现constexpr在以后版本中的部分原因g++g++每个数学函数的实现foo只调用一个内置函数__builtin_foo,它被视为constexpr.我或许可以开始调用__builtin_foo函数而不是foo函数 - 即使相应的函数符合要求,这些函数仍可能保留constexpr在未来版本中- 但这只会有助于未来验证,而不是可移植性.g++foo我遇到了一些不同的例子,std::abs可以给出意想不到的结果:
<cstdlib>为整数类型<cmath>提供重载,同时为浮点类型提供重载.未能包含正确的标头会给出未定义的行为,允许编译器静默接受std::abs(short)返回a double,尽管大多数编译器忽略相关的措辞并返回int.这个问题的解决方案表明在C++ 17中改变了措辞,因此std::abs(short)返回一个intstd::abs可能会导致难以发现的错误,因为(在现代C++中)引入的头文件std::abs是允许引入一个全局abs函数(可能有也可能没有相同的重载),并且很容易意外使用abs而不是std::abs我所知道的修复是:
<cstdlib>评估std::abs([integral type])和<cmath>评估时std::abs([floating point type])std::abs(short)可能返回int或double依赖于编译器符合C++ 11/C++ 14标准的事实–Wconversion以便调用abs(2.0)在编译时触发警告abs模棱两可特技:
namespace neveruse{ …Run Code Online (Sandbox Code Playgroud) 我正在阅读C++ Primer,3rd Ed(Lippman和Lajoie),并且它说当需要重新分配向量以便为添加的更多元素腾出空间时push_back(),元素在新空间中被复制构造然后是析构函数被称为旧元素.我很困惑为什么这是必要的 - 为什么数据不能一点一点地复制?我假设答案与动态内存分配有关,但我目前的推理方法是,即使向量元素处理动态内存,实际存储在元素中的数据也将是指针,这意味着按位复制将保留它们指向的位置并且不会出现任何问题.我可以看到如何重新定位元素指向的动态分配的内存将是一个问题,因为它会使指针无效,但据我所知,向量重新定位没有理由这样做.
有人能给我一个不应该逐位移动的类的简单例子吗?
我的问题是这个问题的扩展: 如何使用 sfinae 来选择构造函数?
在上一个问题中,提问者只是想有选择地启用单个构造函数。我想根据类模板参数类型是否可默认构造来更改构造函数的行为 - 我能想出的最好方法是让两个构造函数具有相同的用法,以便只启用一个对于每个实例化。我的情况也不同,因为如果我不尝试有选择地启用 with enable_if(而在链接的问题中,构造函数的两个版本都是模板化的)int otherN)。
上述问题的已接受答案中的评论将我带到了此站点,这使我创建了以下最小示例:
#include <iostream>
#include <type_traits>
namespace detail {
enum class enabler {};
enum class disabler {};
}
template <typename Condition>
using EnableIf = typename std::enable_if<Condition::value, detail::enabler>::type;
template <typename Condition>
using DisableIf = typename std::enable_if<!Condition::value, detail::disabler>::type;
template<typename T>
struct A {
T data;
// Valid if T is default-construtible; SFINAE otherwise
template<EnableIf<std::is_default_constructible<T>>...>
A() { std::cout << "Data defaulted" << std::endl; }
// Valid if T is …Run Code Online (Sandbox Code Playgroud) 引用Valgrind教程:
优化的代码可能导致valgrind错误报告未初始化的值错误。作者知道如何解决此问题,但是它会使valgrind变慢得多(并且已经相当慢了)。建议的解决方案是在尝试使用valgrind调试代码时不进行优化。无论如何,调试时不进行优化是一个很好的经验法则。
(来源:https : //people.gnome.org/~newren/tutorials/developing-with-gnome/html/ch03s03.html)
哪种类型的优化会导致这种情况,它们又不是真正的问题吗?