标签: libstdc++

为什么 std::regex 比其他正则表达式库慢得多?

这个 Github 存储库将 std::regex 添加到正则表达式引擎列表中,但被其他引擎淘汰了。

为什么 std::regex - 在 libstdc++ 中实现 - 比其他的慢得多?这是因为 C++ 标准要求还是只是特定的实现没有得到很好的优化?

同样在枪战中,即使添加了 std::regex::extended 标志,std::regex 也无法编译所有其他人都接受的几个正则表达式。他们是(?i)Twain、、、、和。\b\w+nn\b(?i)Tom|Sawyer|Huckleberry|Finn\s[a-zA-Z]{0,12}ing\s([A-Za-z]awyer|[A-Za-z]inn)\s\p{Sm}

更新:添加了与 boost::regex 的比较。

UPDATE2:添加了ctre

在此输入图像描述

c++ regex benchmarking libstdc++ re2

20
推荐指数
1
解决办法
1万
查看次数

在g ++/libstdc ++中std :: optional的实现状态?

当我正在开发一个将于2014年左右公开发布的C++库时,我目前正在做出设计选择.使用C++ 14发布的非常有用的工具之一是std::optional.我想知道g++/libstdc++我期望使用哪个版本的版本-std=c++1y.

c++ g++ libstdc++ optional c++14

19
推荐指数
2
解决办法
6298
查看次数

g ++和clang ++与流输入和无符号整数的不同行为

我发现gcc(4.9.2)和clang(3.5.0)之间的行为有所不同,令我感到惊讶.

当我尝试unsigned int从一个std::istringstream带有负值的初始值(在示例中为"-15")中提供一个时,我得到了

  • fail()clang ++ 出错(带位)
  • signed(-15)用gcc ++ 初始化

我准备了以下示例程序.

#include <sstream>
#include <iostream>

int main ()
 {
   std::istringstream iss("-15");

   unsigned int  ui;

   iss >> ui;

   std::cout << "ui[" << ui << "] signed(ui)[" << signed(ui)
      << "] flags[" << iss.fail() << iss.good() << iss.bad()
      << iss.eof() << "]\n";

   return 0;
 }
Run Code Online (Sandbox Code Playgroud)

使用clang ++,我获得以下输出

ui[0] signed(ui)[0] flags[1001]
Run Code Online (Sandbox Code Playgroud)

使用g ++,我获得以下输出

ui[4294967281] signed(ui)[-15] flags[0001]
Run Code Online (Sandbox Code Playgroud)

我有两个问题.

首先是显而易见的:谁是对的?clang ++,g ++还是一个未定义的行为?

第二个是:我如何强制gcc ++的行为类似于clang ++,从一个以减号开头的字符串中提取无符号值时会出错?

谢谢,抱歉我的英语不好.

编辑2016.04.03

我意识到这不是g ++和clang ++之间的区别,而是libstd …

c++ libstdc++ istringstream clang++ libc++

19
推荐指数
1
解决办法
419
查看次数

如何在两个容器的元素之间执行成对二进制操作?

假设我有两个std::vector<uint_32> a, b;我知道具有相同大小的向量.

是否有一个C++ 11范式做一个bitwise-AND所有成员之间ab,并把结果std::vector<uint_32> c;

c++ algorithm libstdc++ c++11

18
推荐指数
1
解决办法
1174
查看次数

`pair :: operator =(pair &&)`错误与`auto&`推导移动操作 - libstdc ++回归?

鉴于此计划:

struct Val
{
    Val() = default;
    Val(Val&&) = default;
    auto& operator=(Val&&);
};

/* PLACEHOLDER */

auto& Val::operator=(Val&&) { return *this; }   
Run Code Online (Sandbox Code Playgroud)

/* PLACEHOLDER */用...... 代替

int main()
{
    std::vector<std::pair<int, Val>> v;
    v.emplace(std::begin(v), 0, Val{});
}
Run Code Online (Sandbox Code Playgroud)

...成功编译:

  • g ++ 6.2.0
  • g ++ 6.3.0
  • g ++ 7.0.1(主干)

  • clang ++ 3.9.1

  • clang ++ 5.0.0(HEAD)

在wandbox上


/* PLACEHOLDER */用...... 代替

template <typename TVec>
void a(TVec& v)
{
    v.emplace(std::begin(v), 0, Val{});
}

int main()
{
    std::vector<std::pair<int, Val>> v;
    a(v);
}
Run Code Online (Sandbox Code Playgroud)

...成功编译:

  • g …

c++ libstdc++ language-lawyer move-semantics c++14

18
推荐指数
1
解决办法
384
查看次数

为什么 std::derived_from 概念是通过添加 cv 限定符的附加可转换性测试来实现的?

在 GCC C++20 概念库中,它有

template<typename _Derived, typename _Base>
    concept derived_from = __is_base_of(_Base, _Derived)
    && is_convertible_v<const volatile _Derived*, const volatile _Base*>;
Run Code Online (Sandbox Code Playgroud)
  1. 为什么要求__is_base_of(_Base, _Derived)不够?
  2. const volatile测试中需要用到什么?

c++ libstdc++ c++-concepts c++20

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

如何避免错误:在抛出'std :: logic_error'的实例后调用terminate what():basic_string :: _ S_construct null无效

if(player!=NULL)
    player->shuffled();
Run Code Online (Sandbox Code Playgroud)

我这样做是为了避免将null引用传递给字符串构造函数,但是在编译时仍然会出错.

c++ libstdc++

17
推荐指数
1
解决办法
7万
查看次数

Windows上的libc ++,Clang和LLVM

我在我的Windows系统上安装了http://sourceforge.net/projects/clangonwin/.我的问题是:

  1. 似乎缺少STD库.我该如何安装?
  2. 如何在VC++,Eclipse,CodeLite或Code :: Blocks中集成它?

windows installation llvm clang libstdc++

17
推荐指数
1
解决办法
3924
查看次数

gcc4.9.2的std :: vector的libstdc ++实现继承自_Vector_base(非虚拟目标).为什么这样好?

所以我一直在使用从std :: vector派生的容器.也许这是一个糟糕的设计决定,原因有几个,而且你是否应该做这样的事情的问题在这里有广泛的讨论:

你不能继承std :: vector

子类/继承标准容器?

从C++ STL容器中获取是否存在任何真正的风险?

是否可以从STL容器继承实现,而不是委托?

我确信我已经错过了一些讨论......但是在链接中找到了两个观点的合理论据.据我所知,"因为~vector()是非虚拟的"是你不应该从stl容器继承的"规则"的基础.但是,如果我在g ++ 4.9.2中查看std :: vector的实现,我发现std :: vector继承自_Vector_base,而_Vector_base是非虚拟析构函数.

template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
{
...
  ~vector() _GLIBCXX_NOEXCEPT
  { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
    _M_get_Tp_allocator()); }

...
}
Run Code Online (Sandbox Code Playgroud)

哪里:

template<typename _Tp, typename _Alloc>
struct _Vector_base
{
...
  ~_Vector_base() _GLIBCXX_NOEXCEPT
  { _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage
    - this->_M_impl._M_start); }

...
}
Run Code Online (Sandbox Code Playgroud)

所以std :: vector的gcc 4.9.2实现继承自带有非虚析构函数的基类.这让我相信这是一种可接受的做法.为什么这样好?这种做法没有危险的具体条件是什么?

c++ inheritance vector libstdc++

17
推荐指数
1
解决办法
1039
查看次数

Is this a bug in std::gcd?

I've come across this behavior of std::gcd that I found unexpected:

#include <iostream>
#include <numeric>

int main()
{
    int      a = -120;
    unsigned b =  10;

    //both a and b are representable in type C
    using C = std::common_type<decltype(a), decltype(b)>::type;
    C ca = std::abs(a);
    C cb = b;
    std::cout << a << ' ' << ca << '\n';
    std::cout << b << ' ' << cb << '\n';

    //first one should equal second one, but doesn't
    std::cout << std::gcd(a, b) …
Run Code Online (Sandbox Code Playgroud)

c++ unsigned libstdc++ language-lawyer c++17

17
推荐指数
1
解决办法
419
查看次数