精华内容
参与话题
问答
  • <div><p><a href="https://abseil.io">Abseil</a> does not provide, nor are they planning to provide a <code>make install</code> target. The details are in abseil/abseil-cpp#38 and their ...
  • <p>Specify library name and version: <strong>abseil/20200205</strong></p> <ul><li>[X] I've read the <a href="https://github.com/conan-io/conan-center-index/wiki#how-to-submit-a-pull-request">...
  • [request] abseil/latest

    2020-12-02 00:44:01
    <div><h3>Package Details <ul><li>Package Name/Version: <strong>abseil/latest</strong></li><li>Website: <strong>...1</strong></li> <h3>Description Of The Library / Tool <p>Abseil is an open source ...
  • Update abseil:20200901

    2020-12-02 04:19:52
    <div><p>Specify library name and version: <strong> abseil:20200901</strong></p> <ul><li>[x] I've read the ...
  • <div><p>Now that Abseil is close to (or done?) adding a cmake install target (https://github.com/abseil/abseil-cpp/issues/111), we may want to consider adding Abseil as a dep and using it where ...
  • Compiling error with abseil

    2020-11-25 12:17:47
    abseil/src/abseil-build/absl/synchronization/libabsl_synchronization.a' , needed by 'cartographer.common.blocking_queue_test' , missing and no known rule to make it What is the reason? can...
  • Add the abseil/20200205

    2020-12-02 17:54:04
    <div><p>Specify library name and version: <strong>abseil/20200205</strong></p> <p>Closes https://github.com/conan-io/conan-center-index/issues/710</p> <ul><li>[x] I've read the ...
  • It seems that <code>abseil</code> is missing <code>absl_status</code> <code>absl_cord</code> in the recipe library list. See provided logs for more info. <h3>Package and Environment Details (include ...
  • m importing a module that internally uses abseil logging. The rest of our code base is using standard python logging. This is leading to a situation where importing that module is interfering with the...
  • Add abseil/20200225.2

    2020-12-02 22:15:13
    <p>Specify library name and version: <strong>abseil/20200225.2</strong></p> <ul><li>[X] I've read the <a href="https://github.com/conan-io/conan-center-index/wiki#how-to-submit-a-pull-request">...
  • <div><p>Specify library name and version: <strong>abseil/all</strong></p> <ul><li>[x] I've read the ...
  • Abseil", but CMake did not find one. <p>Could not find a package configuration file provided by "Abseil" with any of the following names: <pre><code>AbseilConfig.cmake abseil-config....
  • abseil源码.zip

    2020-04-14 08:39:51
    下载github上的abseil,然后单独编译这个库,更改部分cartographer和cartographer_ros的代码即可,希望对大家有所帮助 。
  • <p>Inspired by <a href="https://youtu.be/fHNmRkzxHWs">one of the cppcon talks</a> I listen to during my free time, I have quickly tried the hash maps from <a href="https://abseil.io/">Abseil</a> ...
  • 它是从Google内部代码块中抽取出来的一系列最基础的软件库。作为基本的组成部分,这些软件库支撑了几乎全部Google在...Abseil是Google代码库的最基本构建模块,其代码经过了生产环节测试,此后还会继续得到完全的维护。
  • 它是从Google内部代码块中抽取出来的一系列最基础的软件库。作为基本的组成部分,这些软件库支撑了几乎全部Google在...Abseil是Google代码库的最基本构建模块,其代码经过了生产环节测试,此后还会继续得到完全的维护。
  • import `abseil::optional`

    2020-12-01 22:22:01
    <div><p>Based on abseil version bf7fc99, the same version as the other imported abseil libraries. <p>Will eventually merge to <code>abseil-mirror; right now into the pending branch <code>cpp/port_...
  • Add abseil-cpp

    2020-12-01 23:41:07
    <div><p>https://github.com/abseil/abseil-cpp</p><p>该提问来源于开源项目:haikuports/haikuports</p></div>
  • GRPC交叉编译必须的基础库之一,目前最新的发布版本。在交叉编译GRPC时候,必须先编译好此库,并放到third_party的对应的abseil中。
  • [转]Google开源的C++库 Abseil

    千次阅读 2018-05-29 19:14:02
    概述:Abseil已在Google历经十多年的开发,它的目的是为Google编程人员在各种项目上的工作需求提供支持,这些项目包括Protocol Buffers、gRPC和TensorFlow等。Google公开了其项目内部使用的一系列C++库,随后还会...


    概述:Abseil已在Google历经十多年的开发,它的目的是为Google编程人员在各种项目上的工作需求提供支持,这些项目包括Protocol Buffers、gRPC和TensorFlow等。
    Google公开了其项目内部使用的一系列C++库,随后还会公开其Python库。

    Abseil已在Google历经十多年的开发,它的目的是为Google编程人员在各种项目上的工作需求提供支持,这些项目包括Protocol Buffers、gRPC和TensorFlow等。Google评价Abseil为:
    • 它是从Google内部代码块中抽取出来的一系列最基础的软件库。作为基本的组成部分,这些软件库支撑了几乎全部Google在运行的项目。以前这些API是零零散散地嵌入在Google的大部分开源项目中,现在我们将它们规整在一起,形成这样一个全面的项目。
    • Abseil是Google代码库的最基本构建模块,其代码经过了生产环节测试,此后还会继续得到完全的维护。

    最初,Abseil提供的抽象并非C++ 14或C++ 17的组成部分,但最终它们已被添加到C++标准中。例如,Google提供一个称为StringPiece的类型,随后C++ 17也添加了一个称为std::string_view的相近类型。为了与新的C++ 17类型具有一致的API,Google将StringPiece重构为absl::string_view。从底层机制上看,如果开发人员正在使用的是C++ 17,那么Abseil的string_view默认为标准实现;如果开发人员正在使用的是C++ 17以前的版本,那么string_view默认为Google的实现。
     
    使用Abseil的优点在于可以访问一些目前依然尚未添加到标准中的C++特性,并且一旦这些特性被添加到C++标准中,Google保证会重构这些特性为默认使用标准实现。Google鼓励开发人员使用Abseil,并提及已有超过两亿五千万行的C++代码使用它,并且几乎所有从头开始构建的项目都使用了它。这意味着,Abseil已被Google广为使用,并出于与项目需求同步的考虑而得以频繁维护。
     
    Abseil中包括如下的库:
    • base:初始化,以及其它的基础代码。 
    • algorithm:对C++的<algorithm>库的补充,并为原算法提供了基于容器的版本。 
    • container:提供了更多的STL类型容器。 
    • debugging:用于检查泄漏的调试库。 
    • memory:包括兼容C++ 11版本的std::make_unique()和内存管理。 
    • meta:包括兼容C++ 11版本的类型检查,在C++ 14和C++ 17版本的C++ <type_traits>库中可用。 
    • numeric:兼容C++ 11的128位整数。 
    • strings:各种字符串工具。 
    • synchronization:并发原语和同步抽象。 
    • time:抽象了绝对时间点操作和时区操作。 
    • types:非容器工具的类型。 

    Abseil的代码采用Apache许可,已发布在GitHub上。其Python版本的软件库将随后发布。


    来源:https://www.evget.com/article/2017/10/9/26962.html



    最近 Google 开源了其内部多年使用的 C++ 代码库 Abseil 作为 C++ 标准库的补充,并会对其进行持续更新,本文对其进行简要介绍。

    一句话概括,这个库的特点是用 C++ 11 的代码实现了许多 C++ 14 和 C++ 17 的特性,所以你的编译器也要支持 C++ 11(gcc 4.8+/clang 3.3+,不同平台略有差异)。

    需要注意一点的是 Google 内部代码是不支持异常(Excepton)的,C++ 异常的优劣之处有许多讨论(知乎上的讨论),不用异常可以在一定程度上利于编译器优化,这里主要可能还是历史支持原因。如果你的项目是支持异常的建议要好好测试一下,具体参考下 abseil / Abseil Fundamentals


    Abseil 简要组成部分如下:

    • base Abseil Fundamentals :包含初始化代码和其它部分依赖的代码。除了 C++ 标准库外不依赖外部代码
    • algorithm :C++ <algorithm> 库的增强
    • container :STL 风格容器
    • debugging :内存泄露检查
    • memory :智能指针和内存管理
    • meta :用 C++11 兼容代码支持 C++14 和 C++17 版本的 <type_traits> 库
    • numeric :支持 C++11 兼容的 128 位整数
    • strings :string 相关函数增强
    • synchronization :同步原语和抽象支持
    • time :时间方面的计算
    • types :非容器类型的工具类型


    一些使用要点:

    • 不要使用编译版本的库,不保证 ABI 二进制级别的兼容
    • 不会频繁更新 API 接口,如果更新会提供工具,请使用工具或指导进行更新(毕竟谷歌内部的代码库有超过250M行,不可能全部手动更新)
    • 共享库的 dynamic unloading 可能不被支持,同时不是所有代码都支持动态载入
    • 尽量使用命名空间前缀 absl
    • 支持基本的异常,但自定义的异常可能不被完整支持
    • 至少五年的支持(哈哈,想起了 google reader)
    • 需要使用 Bazel (类似于CMake,最早是用来支持 TensorFlow 开发的工具)进行编译,这个可能会影响现有代码的构建方式

    另外 Google 还开源了一份 python 代码库 abseil-py


    更多内容参见如下链接:

    [1] 选择 abseil 的原因

    [2] 兼容性指导

    [3] abseil / Design Notes :设计理念,现在还只有两篇文章,后续应该会更新

    [4] abseil.io/tips/ : 这里会每周介绍一些谷歌内容的 C++ tips


    来源:https://zhuanlan.zhihu.com/p/29940200


    展开全文
  • Abseil之Return Policy

    2019-06-24 20:28:20
    许多旧的C++代码库显示有点害怕复制对象的模式。幸运的是,由于所谓的“return value optimization”(rvo),我们可以不复制而“复制”。 RVO是几乎所有C++编译器的一个长期特性。考虑下面的C++ 98代码,它有一个...

    许多旧的C++代码库显示有点害怕复制对象的模式。幸运的是,由于所谓的“return value optimization”(rvo),我们可以不复制而“复制”。

    RVO是几乎所有C++编译器的一个长期特性。考虑下面的C++ 98代码,它有一个复制构造函数和一个赋值操作符。这些功能非常昂贵,开发人员让它们每次使用时都打印一条消息:

    class SomeBigObject {
     public:
      SomeBigObject() { ... }
      SomeBigObject(const SomeBigObject& s) {
        printf("Expensive copy …\n", …);
        …
      }
      SomeBigObject& operator=(const SomeBigObject& s) {
        printf("Expensive assignment …\n", …);
        …
        return *this;
      }
      ~SomeBigObject() { ... }
      …
    };
    

     请注意,我们有意避免在这里讨论移动操作。更多信息请参见TotW #77

    如果这个类有如下工厂方法,您会在恐惧中退缩吗?

    static SomeBigObject SomeBigObjectFactory(...) {
      SomeBigObject local;
      ...
      return local;
    }
    

     看起来效率很低,不是吗?如果我们运行以下程序会发生什么?

    SomeBigObject obj = SomeBigObject::SomeBigObjectFactory(...);
    

     简单回答:您可能期望至少创建两个对象:从被调用函数返回的对象和调用函数中的对象。两者都是副本,因此程序打印两条关于昂贵操作的消息。现实世界的答案:没有消息被打印出来——因为从未调用复制构造函数和赋值运算符!

    怎么会这样?许多C++程序员编写“高效代码”,创建一个对象并将该对象的地址传递给一个函数,该函数使用该指针或引用对原始对象进行操作。好吧,在下面描述的情况下,编译器可以将这种“低效拷贝”转换为“高效代码”

     当编译器在调用函数中看到一个变量(将从返回值构造)和一个被调用函数中的变量(将被返回)时,它意识到不需要这两个变量。在封面下,编译器将调用函数变量的地址传递给被调用函数。

    引用C++ 98标准,“每当使用复制构造函数复制临时类对象时,允许实现将原始和副本视为两种不同的引用同一对象的方式,而不执行复制,即使类复制构造函数或析构函数有副作用。对于具有类返回类型的函数,如果返回语句中的表达式是本地对象的名称……允许一个实现省略创建临时对象来保存函数返回值……((第12.8节[class.copy]),C++ 98标准的第15段。C++ 11标准在第12.8节第31段中有相似的语言,但它更复杂)

    担心“允许”不是一个很强的承诺?幸运的是,所有现代C++编译器默认情况下都执行RVO,即使在调试版本中,甚至对于非内联函数也是如此。

    如何确保编译器执行rvo?

    被调用函数应为返回值定义一个变量

    SomeBigObject SomeBigObject::SomeBigObjectFactory(...) {
      SomeBigObject local;
      …
      return local;
    }
    

     调用函数应将返回值赋给新变量:

    // No message about expensive operations:
    SomeBigObject obj = SomeBigObject::SomeBigObjectFactory(...);
    

     就这样!

    如果调用函数重用现有变量来存储返回值,则编译器无法执行rvo(尽管在这种情况下,移动语义将适用于启用移动的类型):

     

    // RVO won’t happen here; prints message "Expensive assignment ...":
    obj = SomeBigObject::SomeBigObjectFactory(s2);
    

     如果被调用函数使用多个变量作为返回值,则编译器也无法执行rvo:

     

    // RVO won’t happen here:
    static SomeBigObject NonRvoFactory(...) {
      SomeBigObject object1, object2;
      object1.DoSomethingWith(...);
      object2.DoSomethingWith(...);
      if (flag) {
        return object1;
      } else {
        return object2;
      }
    }
    

     但是,如果被调用的函数使用一个变量并在多个地方返回它,则可以:

     

    // RVO will happen here:
    SomeBigObject local;
    if (...) {
      local.DoSomethingWith(...);
      return local;
    } else {
      local.DoSomethingWith(...);
      return local;
    }
    

     

    这可能是你所需要知道的所有关于RVO

    还有一件事:Temporaries

    RVO使用临时对象,而不仅仅是命名变量。当被调用函数返回临时对象时,可以从rvo中获益:

     

    // RVO works here:
    SomeBigObject SomeBigObject::ReturnsTempFactory(...) {
      return SomeBigObject::SomeBigObjectFactory(...);
    }
    

     当调用函数立即使用返回值(存储在临时对象中)时,还可以从rvo中获益

     

    // No message about expensive operations:
    EXPECT_EQ(SomeBigObject::SomeBigObjectFactory(...).Name(), s);
    

     最后一个注意事项:如果您的代码需要进行复制,那么就进行复制,不管这些复制是否可以被优化掉。不要为了效率而牺牲正确性。

    展开全文
  • <div><h3>[READ] Step 1: Are you in the right place? <ul><li>For issues or feature requests related to <strong>the code in this repository file a Github issue.<ul><li>If this is a <strong>feature ...
  • abseil的编译与使用

    千次阅读 2018-08-24 19:28:00
    项目中集成了abseilabseil提供了cmake的编译,但是缺少make install命令。 于是有了下面的的一些命令,用于生成include和lib目录。 function cmake_install() { local prefix=$1 lib_path=$prefix/...

    项目中集成了abseil。abseil提供了cmake的编译,但是缺少make install命令。

    于是有了下面的的一些命令,用于生成include和lib目录。

     

    function cmake_install() {
      local prefix=$1
      lib_path=$prefix/deploy/lib
      rand_lib=$lib_path/libabsl.a
      mkdir -p $lib_path
      include_path=$prefix/deploy
      mkdir -p $include_path
      #find $deploy -name "*.a" | xargs -i cp {} $lib_path
      (find $deploy -name "*.o" |  xargs ar cru $rand_lib) | (ranlib $rand_lib)
      (find $deploy -mindepth 1 -name "*.h" -print -or -name '*.inc' -print | grep -v deploy |
        sed "s,$prefix/,," | tar --create --files-from -) | (cd $include_path && tar xvfp -)
    }
    cmake_install $(pwd)

     

    参考

    增强现实的 abseil 库(1)

     

    转载于:https://www.cnblogs.com/westfly/p/9531722.html

    展开全文
  • Abseil之string_view

    2019-06-22 09:44:14
    https://abseil.io/tips/1 什么是string_view,你需要关心什么? 当创建一个以(常量)字符串为参数的函数时,您有四种选择:两种是您已经知道的,两种是您可能不知道的: void TakesCharStar(const char* s); /...

    本文翻译下面网址

    https://abseil.io/tips/1

    什么是string_view,你需要关心什么?

    当创建一个以(常量)字符串为参数的函数时,您有四种选择:两种是您已经知道的,两种是您可能不知道的:

    void TakesCharStar(const char* s);             // C convention
    void TakesString(const string& s);             // Old Standard C++ convention
    void TakesStringView(absl::string_view s);     // Abseil C++ convention
    void TakesStringView(std::string_view s);      // C++17 C++ convention

    前两种情况在调用者使用已经提供的格式的字符串时效果最好。是在需要转换(从const char*转换为string或从string转换为const char*)时会发生什么?

    调用者需要将string转换为const char* 需要使用(高效但不方便)c_str()函数:

    void AlreadyHasString(const string& s) {
      TakesCharStar(s.c_str());               // explicit conversion
    }
    

     调用者需要将const char*转换为string,不需要执行任何其他操作(好消息),但会调用创建(方便但效率低下)临时字符串,复制该字符串的内容(坏消息):

    void AlreadyHasCharStar(const char* s) {
      TakesString(s); // compiler will make a copy
    }
    

     那怎么办呢?

    谷歌接受这些字符串参数的首选方法是通过一个string_view。这是一个“预先采用的”C++ 17的类型——在C++ 17中构建你应该使用std::string_view,在任何不能依赖C++ 17的代码中,你应该使用absl::string_view

    string_view类的一个实例可以看作是进入现有字符缓冲区的“视图”。具体来说,一个string_view只包含一个指针和一个长度,用于标识字符串视图不拥有且不能被该视图修改的字符数据部分。因此,复制一个string_view是一个简单的操作:不复制任何字符串数据。

    string_view具有来自const char*和const string&的隐式转换构造函数,而且由于string_view不进行复制,因此对于生成隐藏的复制没有O(n)内存惩罚。在传递const string&的情况下,构造函数在O(1)时间内运行。在传递const char*的情况下,构造函数会自动调用strlen()(或者可以使用双参数字符串_View构造函数)。

    void AlreadyHasString(const string& s) {
      TakesStringView(s); // no explicit conversion; convenient!
    }
    
    void AlreadyHasCharStar(const char* s) {
      TakesStringView(s); // no copy; efficient!
    }
    

     因为string_view不拥有其数据,所以string_view指向的任何字符串(就像const char*)都必须具有已知的寿命,并且必须比string_view本身的寿命长。这意味着使用string_view进行存储通常是有问题的:您需要一些证据证明基础数据将比string_view寿命更长。

    如果您的API只需要在单个调用期间引用字符串数据,而不需要修改数据,那么接受字符串视图就足够了。如果以后需要引用数据或需要修改数据,则可以使用字符串(string(my_string_view))将其显式转换为C++字符串对象。

     将string_view添加到现有的代码库中并不总是正确的答案:将参数更改为string_view,然后将这些参数传递给需要string或以nul结尾的const char*的函数,则效率可能很低。最好采用从实用程序代码开始向上工作的string_view,或者在启动新项目时完全一致。

    一些附加说明:

    与其他字符串类型不同,您应该像传递int或double那样按值传递string_view,因为string_view是一个小值。

    string_view不一定以nul结尾。因此,下面的写法是不安全的:

    printf("%s\n", sv.data()); // DON’T DO THIS

     但是,以下是可以的:

    printf("%.*s\n", static_cast<int>(sv.size()), sv.data());
    

     可以像输出string或者常量char*一样输出string_view

    std::cout << "Took '" << s << "'";
    

     在大多数情况下,您可以将接受const string& 或者 NUL-terminated的const char*的现有例程安全地转换为string_view。执行此操作时遇到的唯一危险是,如果函数的地址被占用,这将导致生成中断,因为生成的函数指针类型将不同。

    展开全文
  • Abseil一个Google开源内部用的C 标准库。Abseil Common Libraries (C )
  • Abseil之拆分字符串

    2019-06-23 14:00:17
    在任何通用编程语言中,将字符串分割成子串是一个常见的任务,C++也不例外。当谷歌出现需求时,许多工程师发现自己正艰难地通过一个不断增长的头文件分割函数的泥潭。您可能已经找到了满足您需求的输入参数、输出...
  • Abseil之字符串连接

    2019-06-22 15:13:46
    当代码reviower人说:“不要使用字符串连接操作符,它不是那么高效”时,用户常常感到惊讶。std::string::operator+不高效?搞错了吧? 事实证明,这样的低效率并不是显而易见的。实际上,这两个代码段的执行时间...
  • Abseil之New Join API

    2019-06-24 21:39:55
    你们中的许多人要求新的加入API,我们听到了。我们现在有一个连接函数来替换它们,它的拼写是absl::StrJoin()。只需给它一个要联接的对象集合和一个分隔符字符串,其余的就可以了。它将与std::string,absl::string_...
  • Abseil之Copies, Abbrv

    2019-06-24 21:07:36
    一个名字,没有拷贝;两个名字,两份拷贝 在评估是否在任何给定范围内(包括触发RVO的情况)进行复制时,请检查数据引用的名称数量。 在任何一个你有两个活名字的地方,你都会有两份数据拷贝。...
  • Abseil一个Google内部用的开源Python标准库

空空如也

1 2 3 4 5 ... 9
收藏数 161
精华内容 64
关键字:

abseil