首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++17 在业务代码中最好用的十个特性

" << value << std::endl;     }(); } 另外这条限制在 c++20 中已经被删除,所以在 c++20 标准中 gcc clang 都可以捕获结构化绑定的对象了。...std::tuple 的隐式推导 在 c++17 以前,构造std::pair/std::tuple时必须指定数据类型或使用std::make_pair/std::make_tuple函数,c++17...但是在元素已存在时,emplace仍会构造一次待插入的元素,在判断不需要插入后,立即将该元素析构,因此进行了一次多余构造析构操作。c++17 加入了try_emplace,避免了这个问题。...通过使用std::variant,用户可以实现类似 Rust 的std::result,即在函数执行成功时返回结果,在失败时返回错误信息,上文的例子则可以改成: std::variant...,所以在 c++17 中std::variant并不好用,跟 Rust 函数式语言中出神入化的 Sum Type 还相去甚远,但是已经有许多围绕std::variant的提案被提交给 c++委员会探讨

2.4K20
您找到你想要的搜索结果了吗?
是的
没有找到

C++多态性能测试:CRTP vs std::variant vs virtual

C++提供了几种实现多态性的方式,本文将会讨论三种场景的多态: 虚函数:在C++中实现多态性的传统方式是使用函数。这涉及使用基类派生类来实现特定的实现。...测试的组合场景如下: 单纯crtp crtp + std::variant virtual std::variant + std::visit std::variant + std::get_if std...::variant + std::holds_alternative 使用的编译器: gcc 13.2 clang17.0 完整测试代码已放置星球,这里贴一下关键代码(见文末)。...测试结果1:gcc编译,可以看到virtual与std::variant性能差别不大,但是与crtp差别非常大。...测试结果2:clang编译,总体趋势类似gcc编译,只有crtp + std::variant性能明显回退,这个可能也是由于这里用了std::visit导致。

18010

c++17好用的新特性总结

有兴趣的朋友可以看看下面两篇文章: 《c++ inline variable 内联变量 c++17》 《GCCClang 在C模式,较低优化等级下,链接器对内联函数报未定义错误,为什么?》...并没有遵循c++标准,所以以下代码在gcc可以编译,clang则编译不过。...c++20中已经被删除,所以在c++20标准中gccclang都可以捕获结构化绑定的对象了。...但是在元素已存在时,emplace仍会构造一次待插入的元素,在判断不需要插入后,立即将该元素析构,因此进行了一次多余构造析构操作。c++17加入了try_emplace,避免了这个问题。...::variant并不好用,跟Rust函数式语言中出神入化的Sum Type还相去甚远,但是已经有许多围绕std::variant的提案被提交给c++委员会探讨,包括模式匹配,std::expected

2.9K10

libcopp接入C++20 Coroutine一些过渡期的设计

context_t : 用户调度层抽象,用于创建用户自定义类型(TPD)的执行状态机通过提供构造、析构等函数提供功能性接口。...这里面会根据自定义类型的具体情形来决定使用哪种存储结构,也提供了函数来取成功或失败的数据结构状态。功能类似 Rust 的 std::result::Result 。...; // 所有传给 generator_t 的参数都会被透传过来 // 如果允许接受忽略任意参数且仅在协程函数使用,可以申明一个 template<class......而我们主要还是要测试协程的开销,并且我们的项目中也会使用 jemalloc 来替换掉默认的内存分配器。...看涉及的符号名感觉是GCC的BUG,猜测是GCC 10.1.0实现生成的符号可见性有点问题,我没有过多地深究。 生命周期析构 本来受 cppcoro 的启发,想实现这样的使用接口。

1.5K30

关于opentelemetry-cpp社区对于C++ Head Only组件单例符号可见性的讨论小记

这种情况又不太一样,各个模块会直接使用本地的函数,不再从GOT中查找。导致各个模块最终使用的同名变量函数地址不一样。...而在PE中,dll调用函数,除非标记为 __declspec(dllimport),总是从本模块的符号表总查找。...同时在Windows下的 GCC/Clang 中,也有对应的选项 __attribute__((selectany)) (注意 selectany 只能用于变量,不能用于函数)。...而函数内static变量是在第一次访问时初始化。 虽然C++ 11规定函数内static变量的初始化必须是线程安全的,但是GCCClang都是通过一个atomic操作去判定是否初始化的。...另一个更大的问题是,对全局变量的初始化会直接写进模块的初始化函数,这会导致如果多个模块引用同名全局变量,虽然符号地址走GOT是统一了,但是构造析构函数会执行多次。

96130

C++ ABI总结

如果使用相同的库,clanggcc的C编译器应该可以产生可链接的object file。...调用构造/析构函数(Invoking ctor & dtor):规定了一个类的成员如何构造/析构,例如如何构造成员中的C数组。 class的布局对齐,例如多继承中成员变量的排布。...具体地,如果一个动态库在更新后,原来的可执行文件仍然能正常地使用动态库的函数,而不需要让源代码重新编译,则称库的ABI保持了下去 / 二进制兼容。...GCC使用的是libstdc++,根据这个库的编写团队的成员所说,这个库在5.1/7.1/8,1/9.1/11.1都发生了ABI变化。...比较有名的是5.1中std::stringstd::list的ABI改变了(为了适应C++11关于COW的规定),造成在新编译器中链接之前的代码会运行崩溃(我觉得这是很多公司维持gcc版本在4.9的重要原因

56600

libcopp接入C++20 Coroutine一些过渡期的设计

{ tx: Sender, waker: Waker, } // 因为全局变量访问默认不是线程安全,不标记unsafe无法直接访问 // Mutex不能静态构造使用 lazy_static...context_t : 用户调度层抽象,用于创建用户自定义类型(TPD)的执行状态机通过提供构造、析构等函数提供功能性接口。...这里面会根据自定义类型的具体情形来决定使用哪种存储结构,也提供了函数来取成功或失败的数据结构状态。功能类似 Rust 的 std::result::Result 。...而我们主要还是要测试协程的开销,并且我们的项目中也会使用 jemalloc 来替换掉默认的内存分配器。...Apple clang 9 Clang 6 开编译优化后访问协程栈变量崩溃问题 在CI跑单元测试的时候我发现有些环境里执行协程函数会直接崩溃掉。

75030

令人沮丧的C++性能调试

之后,我们将比较三种主要编译器(GCCClang MSVC)在这方面的表现,并讨论一些潜在的改进或解决方案。...结果是 GCC 12.2、Clang 14.0 MSVC v19.x 最终都会生成一个 call 指令。...文档提到它应该是默认启用的,但如果我不手动指定标志,就无法让编译器执行折叠——请参考 Compiler Explorer 上的示例(https://gcc.godbolt.org/z/KPGe3YYsG...这个似乎是默认启用的——请参考 Compiler Explorer 上关于 Clang 14.x Clang 15.x 之间的比较(https://gcc.godbolt.org/z/7MjM53h7G...我必须说,看到 GCC Clang 维护人员逐步改进调试性能,我感到非常高兴,也非常感谢他们。 无论如何,我不认为硬编码的函数是正确的解决方案。

94320

记一起由 Clang 编译器优化触发的 Crash

只有优化级别在 -O2 以上才会(更容易)复现 仅在 Clang 下复现,GCC 复现不了 好了,一些老鸟可能已经有线索了,下面给出一个最小化的复现程序步骤: // file crash.cpp #include...好了,我们再次以上帝视角审视一下问题函数复现程序,“似乎”可以得出结论:因为 b2s 的布尔类型参数 b 没有初始化,所以 b 中存储的是一个 0 1 之外的值1。...想要解答这个问题,我们不得不看下 clang++ 为 b2s 生成了怎样的指令(之前我们提到 GCC 下没有出现 crash,所以问题可能代码生成有关)。...在此之前,我们应该了解: 样例程序中,b2s 的返回值是一个临时的 std::string 对象,是保存在栈上的 C++ 11 之后,GCCstd::string 默认实现使用了 SBO(Small...到这里,问题就无比清晰了: clang++ 假设了 bool 类型的值非 0 即 1 在编译期,”true” ”false” 长度已知 使用异或指令( 0x5 ^ false == 5, 0x5 ^

1.3K40

iOS编译简析

iOS 在 Xcode 5 版本前使用的是 GCC ,在 Xcode 5 中将 GCC 彻底抛弃,替换为了 LLVM ,这期间也是慢慢过渡过来的,由开始使用 GCC 编译->GCC 与 LLVM 共存-...主要子项目: LLVM 核心库 编译器前端 Clang LLDB libc ++ libc++ lld Clang Clang 是 LLVM 项目的一个子项目,是 C 系列(C、C++、OC)的编译器前端...相对于 GCCClang 具有以下优点 编译速度快:在某些平台上,Clang 的编译速度显著的快过 GCC(Debug 模式下编译 OC 速度比 GGC 快 3 倍) 占用内存小:Clang 生成的...由 Clang 中 Parser Sema 配合完成; 静态分析(Static Analysis):使用它来表示用于分析源代码以便自动发现错误; 中间代码生成(Code Generation):开始...当我们把携带 BitCode 的 App 提交到 AppStore 后,苹果会提取出可执行文件中的 BitCode 段,然后针对不同的 CPU 架构编译链接成不同的可执行文件变体(Variant),不同

1.3K20

安装GCC-8.3.0及其依赖

前言 为体验C++17C++20特性,安装更新版本的GCC编译器。GCC官网为:https://gcc.gnu.org/,从这里可以下载最新版本的GCC。...GCC的依赖库 编译之前先安装好GCC的依赖库:gmp、mpfrmpc。编译还依赖m4等编译工具,如果没有,则在执行configue时会报相应的错误,这时需要先安装好这些编译工具。...cmake前,需设置好下列所环境变量,否则cmake仍将使用默认目录下的gccg++,在CMakeFiles.txt文件中设置CMAKE_C_COMPILERCMAKE_CXX_COMPILER不能解决这个问题...-”等) 2) if/switch语句内可定义初始化变量 3) std::any/std::variant 4... 构造函数的模板推导(class template deduction) 9) 结构化绑定(structured bindings) 2020 暂未定 C++20 第六个

12.7K72

Module partitions符号交叉引用(声明实现分离)

在以前C++为了解决循环依赖问题,经常会把类或者函数声明写前面,实现写后面。然后中间的代码就可以实现内部模块的内聚而互相引用。...为了实现模块可以跨多个文件让接口与实现隔离,可以使用 Module partitions 功能。...简单来说 Module partitions 有几个特性: 使用 : 符号来分隔base模块名partition名。 base模块名决定了链接符号的所有权。...(我这里的版本是 Clang 11.0.0) 猜测以后支持了的话,命令应该是下面这样: clang++ -std=c++20 -stdlib=libc++ -fmodules --precompile...GCC GCC 11以上才初步支持 Module 。我本地下了个snapshot的GCCgcc version 11.0.1 20210321 (experimental) (GCC) )。

1.4K20

Android FFmpeg 编译集成(十四)

交叉编译生成,so动态库 编译工具链 对于C/C++的编译,通常有两个工具 GCC CLANG 。...CLANG 则是更高效的C/C++编译工具,Google在ndk 17 以后,把 GCC 移除了,全面推行使用 CLANG 。.../build_android_clang.sh 等待编译完成,将会在 当前文件夹的/android/armv8-a目录下得到 include lib 两个目录,分别是 头文件 so库文件,就是我们需要编译生成的...] 点击next,配置项目的信息 [bl6zdou83f.png] 点击next,选择使用哪种C++标准,选择Toolchain Default会使用默认的CMake设置即可 [rn7rpxxyw4.png...image.png image.png 配置CMakeLists.txt 上面已经把 so 头文件 放置到对应的目录中了,但是编译器是不会把它们编译、链接、并打包到 Apk 中的,我们还需要在 CMakeLists.txt

9.2K82

每个C++工程师都要了解的十个性能陷阱

C 的构造函数应当改为:   C(A a, B b): a_(std::move(a)), b_(std::move(b)){} 这种写法是 clang-tidy 推荐的https://clang.llvm.org...即使用std::shared_ptr也要使用 std::move 引用等等,尽量避免拷贝。...函数等等,当我们需要存储函数std::function 非常好用,但是 std::function 是有成本的: std::function 要占用 32 个字节,而函数指针只需要 8 个字节 std...::function 封装会需要在堆上分配内存 因此我们只应在必须时才使用 std::function,比如需要存储一个不确定类型的函数。...(六)std::variant std::optional 我在我的另一篇文章《C++17 在业务代码中最好用的十个特性 》大肆吹捧了一波 std::variant std::optional,

1.5K30
领券