copy elision


http://book.51cto.com/art/200810/93007.htm
1.2.2 数据传送指令
mov:数据移动。第一个参数是目的,第二个参数是来源。在C语言中相当于赋值号。这是最广为人知的指令。
xor:异或。这虽然是逻辑运算的指令,但是有趣的是,xor eax,eax这样的操作常常用来代替mov eax,0。好处是速度更快,占用字节数更少。
lea:取得地址(第二个参数)后放入到前面的寄存器(第一个参数)中。
见到xor eax,eax,应该马上明白这是清零操作。
但是实际上,有时候lea用来做和mov同样的事情,比如赋值。看下面一条指令:
lea edi,[ebp-0cch] |
方括弧表示存储器,也就是ebp-0cch这个地址所指的存储器内容。但是lea要求取[ebp-0cch]的地址,那么地址也就是ebp-0cch,这个地址将被放入到edi中。换句话说,这等同于:
mov edi,ebp-0cch |
但是以上mov指令是错误的,因为mov不支持后一个操作数中加入一个减号。但是lea支持,所以可以用lea来代替它。
指令的操作数能采用的运算符号有非常复杂的限制。如果需要使用,应该查询指令手册。
为了讲解stos,下面解说前面提到的代码:
mov ecx,30h |
stos是串存储指令,它的功能是将eax中的数据放入edi所指的地址中,同时,edi会增加4(字节数)。rep使指令重复执行ecx中填写的次数。方括弧表示存储器,这个地址实际上就是edi的内容所指向的地址。这里的stos其实对应的是stosd,其他还有stosb、stosw,分别对应于处理4、1、2个字节,这里对堆栈中30h*4(0c0h)个字节初始化为0cch(也就是int 3指令的机器码),这样发生意外时执行堆栈里面的内容会引发调试中断。
https://msdn.microsoft.com/en-us/library/8dbf701c.aspx
https://msdn.microsoft.com/en-us/library/dd778695.aspx
https://msdn.microsoft.com/en-us/library/aa290051.aspx
http://preshing.com/20110807/the-cost-of-buffer-security-checks-in-visual-c/
http://blog.osom.info/2012/02/understanding-vs-c-compilers-buffer.html
http://baike.baidu.com/view/674171.htm?fromtitle=%E5%BC%82%E6%88%96%E8%BF%90%E7%AE%97&fromid=720417&type=syn
http://www.cnblogs.com/baihmpgy/p/4331500.html
http://news.cnblogs.com/n/516935/
http://news.cnblogs.com/n/516947/
copy elision的更多相关文章
- C++ Copy Elision
故事得从 copy/move constructor 说起: The default constructor (12.1), copy constructor and copy assignment ...
- Copy elision in C++
Copy elision (or Copy omission) is a compiler optimization technique that avoids unnecessary copying ...
- C++的Copy Elision导致的奇怪问题
最近写设计模式作业的时候, 有一个作业是实现装饰器模式 (Decorator Pattern), 由于我不会 Java, 所以只能用 C++ 来实现 在这个背景下, 会有简单(表意)的几个类, 如下: ...
- copy elison & RVO & NRVO
蓝色的博文 To summarize, RVO is a compiler optimization technique, while std::move is just an rvalue cast ...
- Google C++ Style Guide
Background C++ is one of the main development languages used by many of Google's open-source project ...
- 翻译「C++ Rvalue References Explained」C++右值引用详解 Part6:Move语义和编译器优化
本文为第六部分,目录请参阅概述部分:http://www.cnblogs.com/harrywong/p/cpp-rvalue-references-explained-introduction.ht ...
- move和转发
总的来说C++09跟C++98相比的变化是极其重大的.这个变化体现在三个方面,一个是形式上的变化,即在编码形式层面的支持,也就是对应我们所谓的编程范式(paradigm).C++09不会引入新的编程范 ...
- C++临时对象以及针对其进行的优化
C++临时对象以及针对其进行的优化 C++中真正的临时对象是看不见的,它们不出现在你的源代码中. 那么什么时候回产生临时对象呢?主要是三个时刻: 产生临时对象的三个时刻: 用构造函数作为隐式类型转换函 ...
- Google C++ 代码规范
Google C++ Style Guide Table of Contents Header Files Self-contained Headers The #define Guard For ...
随机推荐
- html页面元素事件丢失
前段时间做网站包括最近用mvc做oa都发现这个奇怪现象,就是页面加载完毕后页面元素事件(比如按钮点击.复选框change)一切正常,但是当执行查询或者其他操作后页面事件丢失.具体原因暂没有时间分析,现 ...
- Linux防火墙简介及iptables的基本使用
一.防火墙基础知识 iptables/netfilter:网络防火墙,连接追踪(状态检测) netfilter:工作内核中,让规则能够生效的网络框架(framework) iptables:防火墙规则 ...
- FTP上传-封装工具类
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- grep命令学习
grep(Globally search a Regular Expression and Print), 全面搜索正则表达式并把行打印出来,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把 ...
- linux下一些可用库
1. musl: 为了夸平台,采用小巧玲珑的libc进行静态编译.
- js控制 固定框架内图片 按比例显示 以及 占满框架 居中显示
js控制 固定框架内图片 等比例显示 以及 占满框架 纵横居中显示 通过设置 js函数 fitDiv里面var fit的值就好 function fitDiv (obj) { var target_w ...
- log4j.properties 详解与配置步骤
一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失IN ...
- 中文字符串转换为十六进制Unicode编码字符串
package my.unicode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Uni ...
- DB2 中文排序问题
本地测试库中 代码集: GBK 数据库配置发行版级别 = 0x0c00 数据库发行版级别 = 0x0c00 数据库地域 = CN 数据库代码页 = 1386 数据库代码集 = GBK 数据库国家/地区 ...
- mvc中Url.RouteUrl或者Html.RouteLink实现灵活超链接,使href的值随路由名称或配置的改变而改变[bubuko.com]
mvc,超链接除了直接写在a标签的href内还可以使用路由规则来生成,这样在改变了路由规则或者路由名称时不用再去代码中更改href的值,而且还容易遗漏.借助Url.RouteUrl或者Html.Rou ...