当前位置: 首页 > news >正文

网站版块设计是什么意思怎么建立属于自己的网站

网站版块设计是什么意思,怎么建立属于自己的网站,centos卸载wordpress,医院网站设计模板原文地址 http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ C 的新标准 C11 已经发布一段时间了。本文介绍了新标准中的一个特性#xff0c;右值引用和转移语义。这个特性能够使代码更加简洁高效。 新特性的目的 右值引用 (Rvalue Referene) 是 C 新标准 (…原文地址 http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ C 的新标准 C11 已经发布一段时间了。本文介绍了新标准中的一个特性右值引用和转移语义。这个特性能够使代码更加简洁高效。 新特性的目的 右值引用 (Rvalue Referene) 是 C 新标准 (C11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。它的主要目的有两个方面 消除两个对象交互时不必要的对象拷贝节省运算存储资源提高效率。 能够更简洁明确地定义泛型函数。 回页首 左值与右值的定义 C( 包括 C) 中所有的表达式和变量要么是左值要么是右值。通俗的左值的定义就是非临时对象那些可以在多条语句中使用的对象。所有的变量都满足这个定义在多条代码中都可以使用都是左值。右值是指临时的对象它们只在当前的语句中有效。请看下列示例 : 简单的赋值语句 如int i 0; 在这条语句中i 是左值0 是临时值就是右值。在下面的代码中i 可以被引用0 就不可以了。立即数都是右值。 右值也可以出现在赋值表达式的左边但是不能作为赋值的对象因为右值只在当前语句有效赋值没有意义。 如((i0) ? i : j) 1; 在这个例子中0 作为右值出现在了””的左边。但是赋值对象是 i 或者 j都是左值。 在 C11 之前右值是不能被引用的最大限度就是用常量引用绑定一个右值如 : const int a 1; 在这种情况下右值不能被修改的。但是实际上右值是可以被修改的如 : T().set().get(); T 是一个类set 是一个函数为 T 中的一个变量赋值get 用来取出这个变量的值。在这句中T() 生成一个临时对象就是右值set() 修改了变量的值也就修改了这个右值。 既然右值可以被修改那么就可以实现右值引用。右值引用能够方便地解决实际工程中的问题实现非常有吸引力的解决方案。 回页首 左值和右值的语法符号 左值的声明符号为”” 为了和左值区分右值的声明符号为””。 示例程序 : void process_value(int i) { std::cout LValue processed: i std::endl; } void process_value(int i) { std::cout RValue processed: i std::endl; } int main() { int a 0; process_value(a); process_value(1); } 运行结果 : LValue processed: 0 RValue processed: 1 Process_value 函数被重载分别接受左值和右值。由输出结果可以看出临时对象是作为右值处理的。 但是如果临时对象通过一个接受右值的函数传递给另一个函数时就会变成左值因为这个临时对象在传递过程中变成了命名对象。 示例程序 : void process_value(int i) { std::cout LValue processed: i std::endl; } void process_value(int i) { std::cout RValue processed: i std::endl; } void forward_value(int i) { process_value(i); } int main() { int a 0; process_value(a); process_value(1); forward_value(2); } 运行结果 : LValue processed: 0 RValue processed: 1 LValue processed: 2 虽然 2 这个立即数在函数 forward_value 接收时是右值但到了 process_value 接收时变成了左值。 回页首 转移语义的定义 右值引用是用来支持转移语义的。转移语义可以将资源 ( 堆系统对象等 ) 从一个对象转移到另一个对象这样能够减少不必要的临时对象的创建、拷贝以及销毁能够大幅度提高 C 应用程序的性能。临时对象的维护 ( 创建和销毁 ) 对性能有严重影响。 转移语义是和拷贝语义相对的可以类比文件的剪切与拷贝当我们将文件从一个目录拷贝到另一个目录时速度比剪切慢很多。 通过转移语义临时对象中的资源能够转移其它的对象里。 在现有的 C 机制中我们可以定义拷贝构造函数和赋值函数。要实现转移语义需要定义转移构造函数还可以定义转移赋值操作符。对于右值的拷贝和赋值会调用转移构造函数和转移赋值操作符。如果转移构造函数和转移拷贝操作符没有定义那么就遵循现有的机制拷贝构造函数和赋值操作符会被调用。 普通的函数和操作符也可以利用右值引用操作符实现转移语义。 回页首 实现转移构造函数和转移赋值函数 以一个简单的 string 类为示例实现拷贝构造函数和拷贝赋值操作符。 示例程序 : class MyString { private: char* _data; size_t _len; void _init_data(const char *s) { _data new char[_len1]; memcpy(_data, s, _len); _data[_len] \0; } public: MyString() { _data NULL; _len 0; } MyString(const char* p) { _len strlen (p); _init_data(p); } MyString(const MyString str) { _len str._len; _init_data(str._data); std::cout Copy Constructor is called! source: str._data std::endl; } MyString operator(const MyString str) { if (this ! str) { _len str._len; _init_data(str._data); } std::cout Copy Assignment is called! source: str._data std::endl; return *this; } virtual ~MyString() { if (_data) free(_data); } }; int main() { MyString a; a MyString(Hello); std::vectorMyString vec; vec.push_back(MyString(World)); } 运行结果 : Copy Assignment is called! source: Hello Copy Constructor is called! source: World 这个 string 类已经基本满足我们演示的需要。在 main 函数中实现了调用拷贝构造函数的操作和拷贝赋值操作符的操作。MyString(“Hello”) 和 MyString(“World”) 都是临时对象也就是右值。虽然它们是临时的但程序仍然调用了拷贝构造和拷贝赋值造成了没有意义的资源申请和释放的操作。如果能够直接使用临时对象已经申请的资源既能节省资源有能节省资源申请和释放的时间。这正是定义转移语义的目的。 我们先定义转移构造函数。 MyString(MyString str) { std::cout Move Constructor is called! source: str._data std::endl; _len str._len; _data str._data; str._len 0; str._data NULL; } 和拷贝构造函数类似有几点需要注意 1. 参数右值的符号必须是右值引用符号即“”。 2. 参数右值不可以是常量因为我们需要修改右值。 3. 参数右值的资源链接和标记必须修改。否则右值的析构函数就会释放资源。转移到新对象的资源也就无效了。 现在我们定义转移赋值操作符。 MyString operator(MyString str) { std::cout Move Assignment is called! source: str._data std::endl; if (this ! str) { _len str._len; _data str._data; str._len 0; str._data NULL; } return *this; } 这里需要注意的问题和转移构造函数是一样的。 增加了转移构造函数和转移复制操作符后我们的程序运行结果为 : Move Assignment is called! source: Hello Move Constructor is called! source: World 由此看出编译器区分了左值和右值对右值调用了转移构造函数和转移赋值操作符。节省了资源提高了程序运行的效率。 有了右值引用和转移语义我们在设计和实现类时对于需要动态申请大量资源的类应该设计转移构造函数和转移赋值函数以提高应用程序的效率。 回页首 标准库函数 std::move 既然编译器只对右值引用才能调用转移构造函数和转移赋值函数而所有命名对象都只能是左值引用如果已知一个命名对象不再被使用而想对它调用转移构造函数和转移赋值函数也就是把一个左值引用当做右值引用来使用怎么做呢标准库提供了函数 std::move这个函数以非常简单的方式将左值引用转换为右值引用。 示例程序 : void ProcessValue(int i) { std::cout LValue processed: i std::endl; } void ProcessValue(int i) { std::cout RValue processed: i std::endl; } int main() { int a 0; ProcessValue(a); ProcessValue(std::move(a)); } 运行结果 : LValue processed: 0 RValue processed: 0 std::move在提高 swap 函数的的性能上非常有帮助一般来说swap函数的通用定义如下 template class T swap(T a, T b) { T tmp(a); // copy a to tmp a b; // copy b to a b tmp; // copy tmp to b } 有了 std::moveswap 函数的定义变为 : template class T swap(T a, T b) { T tmp(std::move(a)); // move a to tmp a std::move(b); // move b to a b std::move(tmp); // move tmp to b } 通过 std::move一个简单的 swap 函数就避免了 3 次不必要的拷贝操作。 回页首 精确传递 (Perfect Forwarding) 本文采用精确传递表达这个意思。”Perfect Forwarding”也被翻译成完美转发精准转发等说的都是一个意思。 精确传递适用于这样的场景需要将一组参数原封不动的传递给另一个函数。 “原封不动”不仅仅是参数的值不变在 C 中除了参数值之外还有一下两组属性 左值右值和 const/non-const。 精确传递就是在参数传递过程中所有这些属性和参数值都不能改变。在泛型函数中这样的需求非常普遍。 下面举例说明。函数 forward_value 是一个泛型函数它将一个参数传递给另一个函数 process_value。 forward_value 的定义为 template typename T void forward_value(const T val) { process_value(val); } template typename T void forward_value(T val) { process_value(val); } 函数 forward_value 为每一个参数必须重载两种类型T 和 const T否则下面四种不同类型参数的调用中就不能同时满足  : int a 0; const int b 1; forward_value(a); // int forward_value(b); // const int forward_value(2); // int 对于一个参数就要重载两次也就是函数重载的次数和参数的个数是一个正比的关系。这个函数的定义次数对于程序员来说是非常低效的。我们看看右值引用如何帮助我们解决这个问题  : template typename T void forward_value(T val) { process_value(val); } 只需要定义一次接受一个右值引用的参数就能够将所有的参数类型原封不动的传递给目标函数。四种不用类型参数的调用都能满足参数的左右值属性和 const/non-cosnt 属性完全传递给目标函数 process_value。这个解决方案不是简洁优雅吗 int a 0; const int b 1; forward_value(a); // int forward_value(b); // const int forward_value(2); // int C11 中定义的 T 的推导规则为 右值实参为右值引用左值实参仍然为左值引用。 一句话就是参数的属性不变。这样也就完美的实现了参数的完整传递。 右值引用表面上看只是增加了一个引用符号但它对 C 软件设计和类库的设计有非常大的影响。它既能简化代码又能提高程序运行效率。每一个 C 软件设计师和程序员都应该理解并能够应用它。我们在设计类的时候如果有动态申请的资源也应该设计转移构造函数和转移拷贝函数。在设计类库时还应该考虑 std::move 的使用场景并积极使用它。 回页首 总结 右值引用和转移语义是 C 新标准中的一个重要特性。每一个专业的 C 开发人员都应该掌握并应用到实际项目中。在有机会重构代码时也应该思考是否可以应用新也行。在使用之前需要检查一下编译器的支持情况。
http://www.yutouwan.com/news/300462/

相关文章:

  • 汉中微信网站建设服务网站备案 核验单
  • 重庆网站建设cqsday网站开发一般需要多久
  • 国内室内设计网站推荐专注做一家男生最爱的网站
  • 企业网站优化的三层含义南通网站建设方案咨询
  • 网站ip地址范围建个企业营销型网站
  • 做洁具最好的网站网站开发及app开发报价
  • 网站开发最好用什么语言桥西网站建设
  • 图片做多的网站是哪个道士召唤10个月灵的传奇手游
  • 如何在虚拟空间上做多个网站wordpress 图片 大小
  • 宠物美容网站建设的目的wordpress 分享后下载
  • 设计感的网站网站建设苏州
  • 哪个网站是专门做兼职的湖南营销型网站建设 地址磐石网络
  • 腾讯云建站多少钱蓬莱网站建设哪家好
  • 巫山做网站那家好网站布局是什么
  • 汕头网站建设培训公司网络推广技术外包
  • 高质量外链购买合肥优化营商环境
  • 盘锦网站建设报价网站水印图片欣赏
  • html5 网站源码做调查问卷的网站
  • 域名信息查询网站一些难以发现的网站
  • 网站定制合同和模版的区别做网站 还是淘宝店
  • 学做网站教学百度网盘跨平台app开发工具
  • 赣州做网站建设wordpress页面设置教程
  • 做网站怎样套用模板网站建设投入及费用
  • 烟台哪儿有可以做淘宝网站的高德地图看不了国外
  • 宁波网站建设优化企业vs中可以用新建项目来做网站吗
  • 网站定制微安电力案例中国银行门户网站
  • 合肥网站建设是什么wordpress 排版插件
  • 网站设计师和网页设计师的区别html可视化编辑器
  • 免费网站源码大全wordpress邮件营销
  • 平面设计师作品网站网站备案期间临时网页