针对字符串不同的长度,“编译器”选择不同的优化策略:SSO, eager copy,COW,分别针对短字符串,中等长度字符串,长字符串。不过,现在(2016)的大多数编译器(gcc 4.9.1,vs2008以后,clang++没有测试)都选择SSO.

  SSO: small string optimization

  eager copy

  COW: copy on write

  我们看下面这一代码段,编译器(gcc 4.9.1)

string a="hello world";
string b=a;
assert(a.data() != b.data());
if (a.data()==b.data()) //a.c_str() == b.c_str()
cout<<"true"<<endl;
else
cout<<"false"<<endl;

  结果输出:false。所以,可以很明显的判断出,现代的gcc编译器已经弃用了COW。而网上的一些讨论,早期的gcc是选用COW技术的。

一、COW

  1,一些优点

    1)COW能够减少单步操作时由于分配空间及数据复制带来的瞬间延迟

    2)在某些条件下,COW能够启动空间优化的作用

    不过,对于现代的硬件环境,这两个优点也体现不出优势了。

  2,可能的起源

    COW早期是用在fork进程中的。Linux在fork时,会让子父进程共享一个进程地址空间。只有当进程要修改地址空间的数据时,才会让子父进程拥有自己的拷贝空间。

  3,一些可能的缺陷

    由于COw的本质是共享地址空间,那么在多线程环境中,需要处理竞态(data race)

二、代码段中的函数

  1,std::string::data和std::string::c_str同义

    const char* data() const noexcept;

    const char* c_str() const noexcept;

    返回一个指针,该指针指向一个字符数组,其内容和string object相同。

    示例代码:

// strings and c-strings
#include <iostream>
#include <cstring>
#include <string> int main ()
{
std::string str ("Please split this sentence into tokens"); char * cstr = new char [str.length()+];
std::strcpy (cstr, str.c_str()); // cstr now contains a c-string copy of str char * p = std::strtok (cstr," ");
while (p!=)
{
std::cout << p << '\n';
p = std::strtok(NULL," ");
} delete[] cstr;
return ;
}

  值得注意的是,str.c_str()返回的是一个临时指针,一般使用strcpy对其操作。当然,也可作为函数中char*的参数,如下:

string s = "Hello World!";
printf("%s", s.c_str());

  QAQ,上面的代码段又引入了一个一个函数std::strtok.

  2,strtok

  char * strtok ( char * str, const char * delimiters );

  Split string into tokens。就是把str所指向的字符串,以delimeters中的分隔符,分成一个个子字符串。

  值得注意的是,在子序列的调用中,需要给函数传入一个null pointer,以上一个token的末尾作为新的token扫描开始地址。对应者上面的  

p = std::strtok(NULL," ");

  另外,关于COW的深入探讨,这篇博客比较详细:http://www.cnblogs.com/promise6522/archive/2012/03/22/2412686.html

8,SSO,,eager copy,COW的更多相关文章

  1. NSString属性什么时候用copy,什么时候用strong?

           我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy.那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢 ...

  2. 【转】NSString属性什么时候用copy,什么时候用strong?

    原文网址:http://www.cocoachina.com/ios/20150512/11805.html 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境) ...

  3. NSString属性什么时候用copy,什么时候用strong?【转】

    转自:http://www.cocoachina.com/ios/20150512/11805.html. 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境): ...

  4. 整理 PHPstorm实用个人配置,修改调整个性化快捷键,修改使用phpstorm创建的模板的默认注释:

    对你有助请点赞,请顶------送人玫瑰,手留余香! 1:58 2016/3/12 整理PHPstorm实用个人配置,修改调整个性化快捷键,修改使用phpstorm创建的模板的默认注释: PHPsto ...

  5. iOS中assign,copy,retain之间的区别以及weak和strong的区别

    @property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...

  6. IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?

    对于很多初学者,发现在修饰NSString类型的对象时,会有这样的疑惑?怎么有些人用strong修饰,而有些人用copy修饰呢? 这里有个例子,一.首先声明2个属性: @property (nonat ...

  7. iOS - property,strong,weak,retain,assign,copy,nomatic 的区别及使用

    1:ARC环境下,strong代替retain.weak代替assign,xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的.xcod ...

  8. python学习笔记三 深浅copy,扩展数据类型(基础篇)

    深浅copy以及赋值 对于字符串和数字而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1 = #n1 = 'hahahaha' #赋值n2 = n1#浅co ...

  9. 属性readwrite,readonly,assign,retain,copy,nonatomic

    copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议 ...

随机推荐

  1. asp.net MVC Razor 语法(3)

    编程逻辑:执行基于条件的代码. If 条件 C# 允许您执行基于条件的代码. 如需测试某个条件,您可以使用 if 语句.if 语句会基于您的测试来返回 true 或 false: if 语句启动代码块 ...

  2. 转载:SQL语句Where中使用别名作为判断条件

    原文地址:http://www.cnblogs.com/dwfbenben/p/3307941.html 当我们使用某个表达式作为输出的一列时,我们无法再Where条件中直接使用该列作判断条件.   ...

  3. spring mvc 非注解形式

    目录(?)[+] webxml配置文件 注如果使用注解可以加上-- servlet上下文配置文件 test-servletxml 实体类Empjava StartController控制器 控制器Em ...

  4. Qt QToolTip 控件背景的 QSS 设置方法(摘抄)

    Qt/C++/CSS: QTooltip stylesheet background colour Hi there, I've recently come across a problem deve ...

  5. SGU 248. Integer Linear Programming( 背包dp )

    看了半天...发现就是个背包...然后就不打算敲了. 看了一眼forum..顿时吓傻..其他人用了gcd啊什么的各种奇怪的东西..然后还是敲了个背包结果就AC了= =既然写了代码就扔上来吧... -- ...

  6. Oracle经典书籍推荐

    转自:http://www.cnblogs.com/fjfzhkb/archive/2007/12/05/983381.html 很多网友询问如何选择入门书籍,学Oracle有什么好书,这里给出一些常 ...

  7. jQuery实时获取checkbox状态问题

    在最近的项目开发中,使用jQuery操作checkbox时,发现一个问题. Html代码如下: <body> <div> <inputtype="checkbo ...

  8. R与数据分析旧笔记(⑦)回归诊断

    回归诊断 回归诊断 1.样本是否符合正态分布假设? 2.是否存在离群值导致模型发生较大误差? 3.线性模型是否合理? 4.误差是否满足独立性.等方差.正态分布等假设条件? 5.是否存在多重共线性 正态 ...

  9. 优秀的 Android Studio 插件

    转自:http://www.codeceo.com/article/8-android-studio-plugins.html Android Studio是目前Google官方设计的用于原生Andr ...

  10. 用Cython加速Python程序以及包装C程序简单测试

    用Cython加速Python程序 我没有拼错,就是Cython,C+Python=Cython! 我们来看看Cython的威力,先运行下边的程序: import time def fib(n): i ...