C++11——auto的用法

C++11中引入的auto主要有两种用途:自动类型推断和返回值占位。auto在C++98中的标识临时变量的语义,由于使用极少且多余,在C++11中已被删除。前后两个标准的auto,完全是两个概念。 1.自动类型推断 auto自动类型推断,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推断,可以大大简化我们的编程工作。下面是一些使用auto的例子。

2.返回值占位

3.使用注意事项 (1).我们可以使用valatile,pointer(*),reference(&),rvalue reference(&&) 来修饰auto

(2).用auto声明的变量必须初始化

(3).auto不能与其他类型组合连用

(4).函数和模板参数不能被声明为auto

(5).定义在堆上的变量,使用了auto的表达式必须被初始化

(6).以为auto是一个占位符,并不是一个他自己的类型,因此不能用于类型转换或其他一些操作,如sizeof和typeid

(7).定义在一个auto序列的变量必须始终推导成同一类型

(8).auto不能自动推导成CV-qualifiers(constant & volatile qualifiers),除非被声明为引用类型

(9).auto会退化成指向数组的指针,除非被声明为引用

转载:http://blog.csdn.net/huang_xw/article/details/8760403

Linux网络编程笔记

概述 Linux网络编程是C/C++开发必须掌握的技能。 常用网络模型 select模型 (暂缺) epoll模型 epoll支持水平触发和边缘触发,理论上来说边缘触发性能更高,但是使用更加复杂,因为任何意外的丢失事件都会造成请求处理错误。Nginx就使用了epoll的边缘触发模型。 这里提一下水平触发和边缘触发就绪通知的区别,这两个词来源于计算机硬件设计。它们的区别是只要句柄满足某种状态,水平触发就会发出通知;而只有当句柄状态改变时,边缘触发才会发出通知。例如一个socket经过长时间等待后接收到一段100k的数据,两种触发方式都会向程序发出就绪通知。假设程序从这个socket中读取了50k数据,并再次调用监听函数,水平触发依然会发出就绪通知,而边缘触发会因为socket“有数据可读”这个状态没有发生变化而不发出通知且陷入长时间的等待。 因此在使用边缘触发的 api 时,要注意每次都要读到 socket返回 EWOULDBLOCK为止。 否则netstat 的recv-q会持续增加。 通常来说,et方式是比较危险的方式,如果要使用et方式,那么,应用程序应该 1、将socket设置为non-blocking方式 2、epoll_wait收到event后,read或write需要读到没有数据为止,write需要写到没有数据为止(对于non-blocking socket来说,EAGAIN通常是无数据可读,无数据可写的返回状态). epoll_create int epoll_create(int size); 创建epoll实例,返回的epoll句柄是文件描述符,用完后需要close来关闭。 size: 用来告诉内核要监听文件描述符的数量。自Linux 2.6.8之后,这个参数被忽略,但必须设置为大于0的值。 epoll_ctl int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 用来操作epoll实例,具体操作由op参数指定。struct epoll_event 的定义见下文。 epfd: epoll句柄。 op: 操作选项,有效操作选项如下: EPOLL_CTL_ADD:注册新的fd到epfd中; EPOLL_CTL_MOD:修改已经注册的fd的监听事件; EPOLL_CTL_DEL:从epfd中删除一个fd; fd: 需要进行操作的目标文件描述符。 event: 描述与fd相关联的信息,struct epoll_event 的定义见下文。 epoll_wait […]

程序的内存布局

栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。 堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。堆可以动态地扩展和收缩。 自由存储区,就是那些由 malloc 等分配的内存块,他和堆是十分相似的,不过它是用 free 来结束自己的生命的。(这个不太对吧?外代码区呢?) 全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的 C 语言中,全局变量又分为初始化的和未初始化的(初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被初始化的对象存储区可以通过 void* 来访问和操纵,程序结束后由系统自行释放),在 C++ 里面没有这个区分了,他们共同占用同一块内存区。 常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)

log4cplus创建新日志实例

log4cplus创建新日志实例,实现日志分离。 代码:

logger配置:

另外,log4cplus可以自定义日志级别,理论上应该可以把自定义的日志级别单独写到一个日志文件里,但没实现得了。后续有时间再琢磨。 代码:

logger配置: 没实现单独写到一个日志文件里,就不贴了。

Use ImageMagick to create CMYK image in PHP

The PHP code is below, but the CMYK color of image was channged in photoshop. NEED HELP! $fg was channged to cmyk(61,61,61,0), $bg was correct, but display as white, $lg was channged to cmyk(0,99,99,0).

The created image is below:

Shell按行处理文本

1.从文件中读取

2.从变量中读取

这种管道的处理方式将在子shell中执行,子shell退出后,while循环的变量会全部消亡。如果想保存里面的数据,可参考下述做法,但只能保存一个变量,欢迎读者补充。

CSS强行换行

定义和用法 word-wrap 属性允许长单词或 URL 地址换行到下一行。   默认值: normal 继承性: yes 版本: CSS3 JavaScript 语法: object.style.wordWrap=”break-word” 语法

值 描述 normal 只在允许的断字点换行(浏览器保持默认处理)。 break-word 在长单词或 URL 地址内部进行换行。 实例 允许长单词换行到下一行:

css的 word-break 属性用来标明怎么样进行单词内的断句。

shell脚本中的单双引号经验分享

遇到的问题 在python脚本中使用zip软件打包数据,方法是用os.system(”)来执行shell命令,并设置密码,如PREFIX987rst@@)!%%ZIP(脚本中显示的内容)。因为脚本是同事写的,没想那么多就把字符串直接复制,然后用来解压。故事就开始了——密码错误,不管是linux下,还是windows下,都提示密码错误。各种尝试还是错误,就自己用这个密码压缩解压看看,做法如下: zip -r -P ‘PREFIX987rst@@)!%%ZIP’ abc.zip * unzip -P “PREFIX987rst@@)!%%ZIP” abc.zip -d abc 密码错误!没有任何惊喜。只能求助了。 分析原因 在飞哥的帮助下,原来是单双引号使用不当导致的。对shell没有系统的学习过的我,单双引号在我眼里一直是一样的,在平时的工作中好像也没遇到过什么问题,直到现在。 赶紧查下单双引号的区别: 单引号:当shell碰到第一个单引号时,它忽略掉其后直到右引号的任何字符。 双引号:与单引号类似,但它只忽略大多数字符,一些特殊字符不被忽略,如:$,\,`,! ,特殊字符依然按照shell来执行。 解决方法 知道原因,解决方法就好说了,统一用单引号或者双引号就行了。根据单双引号的差异,强烈建议用单引号。 后续 我自己测试的没问题了,但我按照这个方法去解压以前的压缩文档还是不行。再仔细一看,python中 ‘%’ 字符是需要转义的。 好吧,这个经验适合小白、适合小白、适合小白!

背景图片高斯模糊

javascript 参考代码: blur(document.getElementById(‘list_album_image’),’image-url’,5); function blur(element, src, strength){ var image = new Image(); image.onload = function(e){ var canvas = document.getElementById(‘bk-canvas’); var context = canvas.getContext(‘2d’); canvas.width = $(element).width(); canvas.height = $(element).height(); context.drawImage(this, 0, 0, canvas.width, canvas.height); context.globalAlpha = 0.2; // Higher alpha made it more smooth // Add blur layers by strength to x and y // […]

跨域上传文件

有上传的请求头里加如下: Access-Control-Allow-Headers: Cache-Control, X-Requested-With Access-Control-Allow-Methods: POST Access-Control-Allow-Origin: http://some.example.com