8,SSO,,eager copy,COW
针对字符串不同的长度,“编译器”选择不同的优化策略: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的更多相关文章
- NSString属性什么时候用copy,什么时候用strong?
我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy.那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢 ...
- 【转】NSString属性什么时候用copy,什么时候用strong?
原文网址:http://www.cocoachina.com/ios/20150512/11805.html 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境) ...
- NSString属性什么时候用copy,什么时候用strong?【转】
转自:http://www.cocoachina.com/ios/20150512/11805.html. 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境): ...
- 整理 PHPstorm实用个人配置,修改调整个性化快捷键,修改使用phpstorm创建的模板的默认注释:
对你有助请点赞,请顶------送人玫瑰,手留余香! 1:58 2016/3/12 整理PHPstorm实用个人配置,修改调整个性化快捷键,修改使用phpstorm创建的模板的默认注释: PHPsto ...
- iOS中assign,copy,retain之间的区别以及weak和strong的区别
@property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...
- IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?
对于很多初学者,发现在修饰NSString类型的对象时,会有这样的疑惑?怎么有些人用strong修饰,而有些人用copy修饰呢? 这里有个例子,一.首先声明2个属性: @property (nonat ...
- iOS - property,strong,weak,retain,assign,copy,nomatic 的区别及使用
1:ARC环境下,strong代替retain.weak代替assign,xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的.xcod ...
- python学习笔记三 深浅copy,扩展数据类型(基础篇)
深浅copy以及赋值 对于字符串和数字而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1 = #n1 = 'hahahaha' #赋值n2 = n1#浅co ...
- 属性readwrite,readonly,assign,retain,copy,nonatomic
copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议 ...
随机推荐
- JavaScript之arguements对象学习
简介:在JavaScript中,有一个特殊的对象-Arguements对象,它是当前函数的一个内置属性,它类似与Array对象(数组形式),但不是Array的一个实例.下面通过代码来论证: <s ...
- Java中Lambda表达式的使用
简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能.本人建议不要乱用,因 ...
- MATLAB中求矩阵非零元的坐标
MATLAB中求矩阵非零元的坐标: 方法1: index=find(a); [i,j]=ind2sub(size(a),index); disp([i,j]) 方法2: [i,j]=find(a> ...
- js substr()与substring()的区别
定义和用法 substr 方法用于返回一个从指定位置开始的指定长度的子字符串. 语法 stringObject.substr(start [, length ]) 参数 描述 start 必需.所需的 ...
- jsp建立错误页自动跳转
在各个常用的web站点中,经常会发现这样一个功能:当一个页面出错后,会自动跳转到一个页面上进行错误信息的提示. 想要完成错误页的操作,则一定要满足两个条件: 1.指定错误出现时的跳转页,通过error ...
- XStream和Json
XStream的作用 XStream可以把JavaBean对象转换成XML! 通常服务器向客户端响应的数据都是来自数据库的一组对象,而我们不能直接把对象响应给响应端,所以我们需要把对象转换成XML再响 ...
- 拔一拔 ExtJS 3.4 里你遇到的没遇到的 BUG(1)
本文从今天开始,我要做的就是不断的更新,不断的披露ExtJS 3.4的BUG并修复它.需要注意的是版本为3.4而不是4.0,因为4.0改动和变化比较大,所以不要对号入座. 嘿嘿,本人不怎么写东西,不过 ...
- 产品在焊接时出现异常,尤其是尺寸较大的QFP芯片,焊接后出现虚焊、冷焊、假焊等问题?
1 不良描述 客户采用我们提供的SMT设备后,部分产品在焊接时出现异常,尤其是尺寸较大的QFP芯片,焊接后出现虚焊.冷焊.假焊等不良.应客户要求对这一批不良产品以及生产条件进行分析,以便找到改善的依据 ...
- MFC解决Static控件背景透明时文本覆盖重影
通过映射OnCtlColor消息,而后在该函数中使用pDC->SetBkMode(TRANSPARENT)使Static控件背景透明时会出现:文本覆盖重影的问题,当改变控件的文本就会发生新文本与 ...
- react-native 入门资源合集
# 了解react-native React Native enables you to build world-class application experiences on native pla ...