C C++ 特殊 关键字.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C和C++语言不常用的几个关键字mutable关键字 关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员 我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变, 对像的状态也会随之发生变化! 如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是 该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员 进行赋值.这个时候就需要用到mutable关键字了 例如: class Demo { public: ??? Demo(){} ??? ~Demo(){} public: ??? bool getFlag() const ??? { ??????? m_nAccess++; ??????? return m_bFlag; ??? } private: ??? int? m_nAccess; ??? bool m_bFlag; }; int main() { ??? return 0; } 编译上面的代码会出现 error C2166: l-value specifies const object的错误 说明在const类型的函数中改变了类的非静态数据成员. 这个时候需要使用mutable来修饰一下要在const成员函数中改变的非静态数据成员 m_nAccess,代码如下: class Demo { public: ??? Demo(){} ??? ~Demo(){} public: ??? bool getFlag() const ??? { ??????? m_nAccess++; ??????? return m_bFlag; ??? } private: ??? mutable int? m_nAccess; ??? bool m_bFlag; }; int main() { ??? return 0; } 这样再重新编译的时候就不会出现错误了! ? volatile关键字 volatile是c/c++中一个鲜为人知的关键字,该关键字告诉编译器不要持有变量的临时拷贝,它可以适用于基础类型 如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者 类的所有成员都会被视为volatile. 使用volatile并不会否定对CRITICAL_SECTION,Mutex,Event等同步对象的需要 例如: int i; i = i + 3; 无论如何,总是会有一小段时间,i会被放在一个寄存器中,因为算术运算只能在寄存器中进行。一般来说,volatitle 关键字适用于行与行之间,而不是放在行内。 我们先来实现一个简单的函数,来观察一下由编译器产生出来的汇编代码中的不足之处,并观察volatile关键字如何修正 这个不足之处。在这个函数体内存在一个busy loop(所谓busy loop也叫做busy waits,是一种高度浪费CPU时间的循环方法) void getKey(char* pch) { ?while (*pch == 0) ? ; } 当你在VC开发环境中将最优化选项都关闭之后,编译这个程序,将获得以下结果(汇编代码) ;?????? while (*pch == 0) $L27 ?; Load the address stored in pch ?mov eax, DWORD PTR _pch$[ebp] ?; Load the character into the EAX register ?movsx eax, BYTE PTR [eax] ?; Compare the value to zero ?test eax, eax ?; If not zero, exit loop ?jne $L28 ?; ?jmp $L27 $L28 ;} 这段没有优化的代码不断的载入适当的地址,载入地址中的内容,测试结果。效率相当的低,但是结果非常准确 现在我们再来看看将编译器的所有最优化选项开关都打开以后,重新编译程序,生成的汇编代码,和上面的代码 比较一下有什么不同 ;{ ?; Load the address stored in pch ?mov eax, DWORD PTR _pch$[esp-4] ?; Load the character into the AL register ?movsx al, BYTE PTR [eax] ; while (*pch == 0) ?; Compare the value in the AL register to zero ?test al, al ?; If still

文档评论(0)

***** + 关注
实名认证
文档贡献者

本账号下所有文档分享可拿50%收益 欢迎分享

1亿VIP精品文档

相关文档