小编use*_*176的帖子

constexpr exp,log,pow

我想使用constexpr的标准版<cmath>一样的功能exp,log,pow在便携方式.我目前有一个非便携式解决方案g++将这些功能视为constexpr- 不兼容C++的扩展,但我担心可移植性和面向未来(我想这个扩展可能有一天会被删除g++).

constexpr对这些函数的版本感兴趣,而不是模板元程序 - 我希望在编译时和运行时都可以使用相同的功能.我不需要C兼容性,但我确实需要快速实现 - 诸如Taylor Series扩展之类的天真实现会太慢.

我该如何实现这些功能?我在特别感兴趣exp,logpow

我从研究中学到了一些切向相关的东西

  • 这些功能的标准兼容版本在技术上并不是constexpr因为它们必须具有副作用(例如设置errno)以保持C兼容性
  • 在C++ 11,一种实现被允许进行这些功能constexpr,但作为C++ 14,这是禁止的(每个第一回答这个问题回答这个问题).这是我担心函数可能不会出现constexpr在以后版本中的部分原因g++
  • g++每个数学函数的实现foo只调用一个内置函数__builtin_foo,它被视为constexpr.我或许可以开始调用__builtin_foo函数而不是foo函数 - 即使相应的函数符合要求,这些函数仍可能保留constexpr在未来版本中- 但这只会有助于未来验证,而不是可移植性.g++foo

c++ language-lawyer constexpr c++11

18
推荐指数
2
解决办法
3374
查看次数

如何避免std :: abs的意外结果?

我遇到了一些不同的例子,std::abs可以给出意想不到的结果:

  1. 这个问题(在std :: abs函数上)指出<cstdlib>为整数类型<cmath>提供重载,同时为浮点类型提供重载.未能包含正确的标头会给出未定义的行为,允许编译器静默接受
  2. C++ 缺陷报告2735指出C++ 11和C++ 14标准在技术上要求std::abs(short)返回a double,尽管大多数编译器忽略相关的措辞并返回int.这个问题的解决方案表明在C++ 17中改变了措辞,因此std::abs(short)返回一个int
  3. 这个问题的答案(我什么时候使用fabs以及何时使用std :: abs?)指出依赖std::abs可能会导致难以发现的错误,因为(在现代C++中)引入的头文件std::abs是允许引入一个全局abs函数(可能有也可能没有相同的重载),并且很容易意外使用abs而不是std::abs

我所知道的修复是:

  1. 避免未定义的行为:包括<cstdlib>评估std::abs([integral type])<cmath>评估时std::abs([floating point type])
  2. 两种选择:
    • 使用C++ 17或pre-(C++ 11)
    • 解决std::abs(short)可能返回intdouble依赖于编译器符合C++ 11/C++ 14标准的事实
  3. 两种选择:
    • 传递gcc标志,–Wconversion以便调用abs(2.0)在编译时触发警告
    • 使用一个技巧(改编自nm的答案(使用cmath时禁用math.h废话))使全局变得abs模棱两可

特技:

namespace neveruse{ …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer

11
推荐指数
1
解决办法
314
查看次数

C++:自动向量重新分配调用复制构造函数?为什么?

我正在阅读C++ Primer,3rd Ed(Lippman和Lajoie),并且它说当需要重新分配向量以便为添加的更多元素腾出空间时push_back(),元素在新空间中被复制构造然后是析构函数被称为旧元素.我很困惑为什么这是必要的 - 为什么数据不能一点一点地复制?我假设答案与动态内存分配有关,但我目前的推理方法是,即使向量元素处理动态内存,实际存储在元素中的数据也将是指针,这意味着按位复制将保留它们指向的位置并且不会出现任何问题.我可以看到如何重新定位元素指向的动态分配的内存将是一个问题,因为它会使指针无效,但据我所知,向量重新定位没有理由这样做.

有人能给我一个不应该逐位移动的类的简单例子吗?

c++ stdvector

9
推荐指数
1
解决办法
835
查看次数

如何使用 SFINAE 从 C++11 中的多个选项中选择构造函数

我的问题是这个问题的扩展: 如何使用 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)

c++ templates sfinae c++11

3
推荐指数
2
解决办法
903
查看次数

优化如何触发valgrind误报?

引用Valgrind教程:

优化的代码可能导致valgrind错误报告未初始化的值错误。作者知道如何解决此问题,但是它会使valgrind变慢得多(并且已经相当慢了)。建议的解决方案是在尝试使用valgrind调试代码时不进行优化。无论如何,调试时不进行优化是一个很好的经验法则。

(来源:https : //people.gnome.org/~newren/tutorials/developing-with-gnome/html/ch03s03.html

哪种类型的优化会导致这种情况,它们又不是真正的问题吗?

optimization valgrind

2
推荐指数
1
解决办法
583
查看次数