在C中指针是完成这一目的的标准数据结构,而C++引入了安全性更高的引用类型。所以在C++中若传递的数据仅仅只读,const string&成了C++的天然的方式。...实际上我们本意并不是要改变原字符串,为什么不在原字符串基础上返回呢? 在C++17中引入了string_view,能很好的解决以上两个问题。...s); 基本上都是自解释的,唯一需要说明的是:为什么我们代码string_view foo(string("abc"))可以编译通过,但为什么没有对应的构造函数?...引入的背景, 2.2 自定义字面量 自定义字面量也是C++17新增的特性,提高了常量的易读。...3.string_view指向的内容的生命周期可能比其本身短 string_view并不拥有其指向内容的所有权,用Rust的术语来说,它仅仅是暂时borrow(借用)了它。
首先看看 std::string_view. std::string_view std::string_view 代表一个字符串的非所有权引用(即不负责管理引用字符串的生命周期),他表示的是一个字符序列...u16string_view std::basic_string_view std::u32string_view std::basic_string_view 你也许会有疑问:为什么我们需要...C++ string 的 std::string_view(strView变量), 而第16行代码中创建的 std::string_view(strView2变量) 引用的则是字符数组.在第9行代码中...示例代码的输出已经在注释中写明了.代码第 12 行创建了一个 std::vectorstd::any,你必须使用 std::any_cast 来获取其中的元素,如果你向 std::any_cast 传递了错误的数据类型...0(第一个指定类型 int 的默认初始值).第7行代码中我将整型12赋值给了v,后面我们可以通过 std::get(v) 来获取该值.第9行到11行代码中,我使用了3种方式将v中的数值赋值给了w. std
另外由于SDK里所有模块的数据传递都是通过各自内部的一个叫 Recordable 的对象,并且这个对象还会包含一些SDK内的独有的内容,比如Resource和InstrumentationScope。...首先由于传入的参数 ArgumentType 是个通用引用,它既能匹配左值引用,又能匹配右值,还能匹配是否带 const 和 violate ,所以第一层模板类型提取我们可以用 std::decay> 来传递attributes...接口,通过重载来适配attributes的传递。
std::cout << key << ": " << value << std::endl; }(); } 在 clang 环境下,可以在 lambda 表达式捕获时显式引入一个引用变量通过编译...// from https://stackoverflow.com/a/40129046 // author: Pavel Davydov // string_view的remove_prefix比const...同时 try_emplace 在参数列表中将 key 和 value 分开,因此进行原地构造的语法比emplace更加简洁 std::map m; /...只有当对类型完全未知的情况下,才应当使用std::any,比如动态类型文本的解析或者业务逻辑的中间层信息传递。...常用于可能失败的函数的返回值中,比如工厂函数。在 C++17 之前,往往使用T*作为返回值,如果为nullptr则代表函数失败,否则T*指向了真正的返回值。
++ 20 协程封装 RDMA 操作 使用 C++ 20 协程封装 UCX c++20应用协程举例 STL源码分析之std::function g++8.3,sizeof(std::function)为什么等于...这样实现更快,对于trival类型,这样优化的可以直接memcpy,更高效一些 大概实现成这个样子 template class optional...rbe"), std::fclose); // Do stuff with the file std::fread(buf_.data(), 1, buf_.size(), file.get()); 比写个...what, std::string_view name) -> std::string { return std::string{what} + ", " + std::string{name}...struct { [[nodiscard]] auto operator()( std::string_view what, std::string_view name) const -
当然,想实现线程安全地只执行一次方法,也可以通过加锁和判断标志位的方式来实现。...也就是说它维护了一个 List,编译的时候一项一项检查是否合符规范,但是这个 List 之外的行为并不能被检查出来,这也就是为什么 LLVM 每年都在向这个 List 新增内容。...GNU++17 比 C++17 多了语言扩展。...string_view 简单来说它是指向字符串的指针,但不会拷贝一份字符串。一旦指向的字符串被修改或者被释放了,string_view 的内容也会跟跟着变,毕竟是同一份内存。...就像 OC 中的字符串和数组传递赋值时一般都 copy,string_view 相当于是 assign,搞不好野指针呢。 详见 string_view。
month(11) == thanksgiving.month()); static_assert(day(25) == thanksgiving.day()); 正确使用cpu提供的TSC 能得到比gettimeofday...更快的速度,但rdtsc也有代价,这里做个小科普 A footnote on “Three reasons to pass std::string_view by value” 之前说到,尽量用string_view...就是简单的接口用编译期测试来组合,尽可能constexpr,然后直接static_assert测试 #include #include #include <...string支持contains方法 string从nullptr构造会直接报错 module 话说module发音是妈桌我一直发音成麻豆 一些速度提升 io支持 std::print 干掉iostream,比printf...这个很经典了,就是rocksdb的status类那种形式 stacktrace 应该就是boost哪个库 byteswap 这个是std::endian之后的引入 to_underlying对枚举拿到背后的值,
索引值引用字符代码单位,因此补充字符在字符串中使用两个位置。 除了处理Unicode代码单元(即字符值)的方法外,String类还提供了处理Unicode代码点(即字符)的方法。...,StringBuilder,加号拼接的本质) 一、String对象的不可变性 1.String为什么是不可变的 文档中提到: 字符串是常量;它们的值在创建后不能更改。...当我们使用类似String s = "a"这样的代码创建字符串常量的时候,JVM会先检查“a”这个字符串是否在常量池中: 如果存在,就直接将此String对象地址赋给引用s(引用s是个成员变量,它在虚拟机栈中...实际上,执行完以后对象在内存中的情况是这样的: 3.小结 使用new或者字面值形式创建String时都会根据常量池是否存在同值对象而决定是否在常量池中创建对象 使用字面值创建的String,引用直接指向常量池中的对象...在可能的情况下,建议优先使用此类而不是StringBuffer,因为在大多数实现中它会更快。
有兴趣的朋友可以看看下面两篇文章: 《c++ inline variable 内联变量 c++17》 《GCC,Clang 在C模式,较低优化等级下,链接器对内联函数报未定义错误,为什么?》...{ std::cout << key << ": " << value << std::endl; }(); } 在clang环境下,可以在lambda表达式捕获时显式引入一个引用变量通过编译...同时try_emplace在参数列表中将key和value分开,因此进行原地构造的语法比emplace更加简洁。...只有当对类型完全未知的情况下,才应当使用std::any,比如动态类型文本的解析或者业务逻辑的中间层信息传递。...常用于可能失败的函数的返回值中,比如工厂函数。在C++17之前,往往使用T*作为返回值,如果为nullptr则代表函数失败,否则T*指向了真正的返回值。
新特性一览 语言新特性 类模板的模板参数推断 用auto来声明非类型的模板参数 折叠表达式 auto对花括号初始化的新推断规则 Lambda的常量表达式形式 Lambda可以值捕获this了 内联变量...this了(Lambda capture this by value) 之前的时候在Lambda中捕获的this只能是引用形式的。...一个有问题的例子是对于引用捕获,Lambda要求其对象必须确实存在,但有可能到了调用的时候已经超过了目标对象的生命周期。...UTF-8字符字面量的值与它的ISO 10646标准的字符点值相同。...是对一个字符串的非拥有的引用,可以运用成员函数自由地改变观测这个字符串的方式,构造速度很快但是无法修改这个字符串。
2. lambda表达式 lambda也是c++11中引入的,在C++11中,lambda表达式只能用捕获this,this是当前对象的一个只读的引用。...当我们通过函数创建一个对象时,通常使用通过函数返回错误码,而通过出参返回对象本身。...如果通过optional返回创建的实例,就会变得更加直观, std::optional 提供了下面几个方法: has_value() // 检查对象是否有值 value() // 返回对象的值...,值不存在时则抛出 std::bad_optional_access 异常 value_or() // 值存在时返回值,不存在时返回默认值 3. std::any 一个类型安全的可以保存任何值的容器...string_view可以理解成原始字符串一个只读引用。 string_view 本身没有申请额外的内存来存储原始字符串的data, 仅仅保存了原始字符串地址和长度等信息。
我不知道为什么要等到C++20才引入char8_t,那么提个问题char16_t和char32_t在哪个标准存在呢?留言区见 注:本篇文章的所有代码已同步至星球,更多优质内容一起探讨。...以下是演示std::string_view简单用法的示例: #include #include #include void printString...(std::string_view str) { std::cout << str << std::endl; } int main() { std::string_view strv{"strv...作为参数,这使得这个函数非常轻量级和灵活,因为没有制作任何字符串的副本,这个函数可以通过传递C和C++样式的字符串以各种方式使用。...正如名称所示,这些函数确定一个字符串(或字符串视图)是否以某个字符或某个std::string_view开头/结尾。
如果需要再对象的新拷贝上进行操作的情况下,建议直接使用obj方式 String接口的优化 不推荐使用const String&(除非调用方确保有现成的String对象); 如果不需要修改字符串内容,可以使用string_view...最好选择传递引用,而不是传递值。 运算表达式优化 在运行过程中,尽量把常量合并到一起。...在除法、取余运算情况下,unsigned ints(无符号类型)会快于 signed ints(有符合类型) 除法中,除以常量会比除以变量效率高,因为可以在编译期做优化,尤其是常量可以表示成2^n时...浮点除法比乘法慢很多,所以可以利用乘法来代替除法运算,这样可以提高代码性能。 内存优化 程序在运行时,占用内存越少,那么它的运行效率也就更快,也说明程序的运行性能较好。...9、可以通过使用智能指针代替指针的使用。 10、优化动态库文件的加载,尽量避免不必要的IO操作。
fmtlib 8.0 fmtlib 8.0 的接口变化 fmtlib 其实有一个比直接用 C++20 Text Formatting 更好的地方。...因为 "Hello {}" 是编译期常量。 但是在实际使用中,我们时而会对 format 接口包装一层,增加一下自己的处理。...会报错,为什么呢?我们可以先来回顾一下 fmt::format(...) 的声明: template <typename......里后面的参数是 通用引用(Universal Reference) 而 fmt::format_to_n(...) 是 常量引用 。...然后就会通过 SFINAE 机制去尝试所有可能的类型转换,最后失败出现编译错误。 这个问题我已经提了 Issue 和 PR 了。目前已经合入了,估计下个版本就会包含进去。
字符型常量和字符串常量的区别****形式上:** 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符**含义上:** 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表一个地址值...对象的相等与指向他们的引用相等,两者有什么不同?**对象的相等 比的是内存中存放的内容是否相等而引用相等 比较的是他们指向的内存地址是否相等。**25....当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象。...Java中的值传递和引用传递****值传递**是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。(因为值传递的时候,实际上是将实参的值复制一份给形参。)...**引用传递**是指对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象的改变会反映到所有的对象上。(因为引用传递的时候,实际上是将实参的地址值复制一份给形参。)
指针是c语言为什么如此流行的一个重要原因,正是有了指针的存在,才使得c/c++能够可以比使用其他语言编写出更为紧凑和有效的程序,可以说,没有掌握指针,就没有权利说自己会用c/c++.然而。...一,内存和地址 我们知道,计算机内存的每个字节都有一个唯一的地址,CPU每次寻址就是通过固定的步长(这就解释了为什么需要内存对齐)来跳跃进行寻址的。...a的地址,也就是2000,当我们想通过p来操纵a的话,首先要根据p保存的地址找到它指向的内容,也就是解引用*p,当*p的内容放生改变的时候,首地址为2000的内存单元存储的值也会做出改变,因此变量当*p...因此对q进行解引用也即*q得出的是p,也就是2008,再对(*q)进行解引用也即*(*q)得出的才是变量a的值,由于运算符的结合性自右向左,因此括号可以省略,也即**q才是a的值。...为什么是这样呢?这是因为[]的优先级比*要高。p1 先与[]结合,构成一个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素。
存储引用数据类型的引用 堆存储对象 对象的地址是栈中的引用 为了让你更好的理解 我这里把学习引用传递 值传递时候的理解写到下面 一定要理解透彻 很重要!...你知道值传递和引用传递的区别吗 答案1这里需要注意形参和实参的传递 否则容易出事故 答案2其实只有值传递确切的来说是地址传递 下面分析下图带大家更好的理解 回答这道题你首先得知道什么是值传递 什么是引用传递...肯定是值传递 这里就会有人很疑惑 究竟啥玩意儿,咋tm和我看的定义不一样 所有不需要深挖概念 下面我告诉你答案 其实只有值传递 确切来说是地址传递 为什么这样说呢?...基本数据类型是直接接受值 引用数据类型接受堆中的地址 这也是为什么传递对象之间修改会改变实参 而new对象的话实参对象不会修改的原因 这里抛出一个问题: 我在学习时 看到这样一句话:String...有的话直接返回地址引用 没有的话需要把堆中对象引用复制到字符串常量池再返回常量池的引用值 三、通过上面的学习,刚才的问题就迎刃而解了 一、 String str = new String("Joseph
常引用 #include int main() { const int a = 10;//a是常量 int& ra = a;//a是常量不可以被改变,这里引用等于ra可以被改变也就等于...int& b = 10;10本身是一个常量不能被修改,直接引用也是不可以的。...int d = 10; double& rd = d;//不同类型的不可以 这里为什么不同类型的不可以呢?...传值、传引用效率比较 以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直 接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效 率是非常低下的...有多级指针,但是没有多级引用。 访问实体方式不同,指针需要显式解引用,引用编译器自己处理。 引用比指针使用起来相对更安全。
所以针对这些类型,Java采取了与C和C++相同的方法,也就是说,不用new来创建变量,二是创建一个并非是引用的“自动”变量。这个变量直接存储“值”并置于常量区中,因此更加高效。...(事实上,Integer类的缓存上限是可以通过修改系统来更改的。了解就行了,不必去深究。) ? 缓存机制 为什么引入缓存机制 这回到了为什么引入基础类型这个特例的问题上。...引发的问题:值传递还是引用传递? java是值传递还是引用传递的呢?毫无疑问,java是值传递的。那么什么又叫值传递和引用传递呢? 我们先来看一个例子: ?...例子 这是一个很经典的例子,我们希望调用了swap函数以后,a和b的值可以互换,但是事实上并没有。为什么会这样呢? 这就是因为java是值传递的。...传递的过程中,changgeAge也有洁癖,于是复制了一份小明的引用,这个副本也指向小明。 然后changgeAge通过自己的副本引用,改变了小明的年龄。
另外size()、length()、max_size()、capacity()这4个函数返回的都是length_,他们的值是相同的。这点和std::string是不同的。...也就是无法通过[]来修改原类型的。其二就是std::string返回的都是引用(const版本是const引用),而StringPiece返回的值类型。...*(ptr_ + length_ - 1) : '\0'; } 支持front()、back()直接返回首尾元素,同样是const函数,且返回的是值。和普通std::string不同。...比std::string多两个函数:front_or_0()和back_or_0(),他们是当字符串长度为0的时候,返回一个'\0'字符。...截取子串 StringPiece也有substr函数可以截取子串,其返回值也是StringPiece。
领取专属 10元无门槛券
手把手带您无忧上云