??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩亚洲欧美久久久www综合网,亚洲精品无码久久不卡,一本久久a久久精品vr综合http://www.shnenglu.com/Daywei0123/技术追求卓?梦想创造未?/description>zh-cnWed, 07 May 2025 18:17:00 GMTWed, 07 May 2025 18:17:00 GMT60CMake使用http://www.shnenglu.com/Daywei0123/archive/2016/09/11/214272.htmlDayweiDayweiSun, 11 Sep 2016 14:52:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2016/09/11/214272.htmlhttp://www.shnenglu.com/Daywei0123/comments/214272.htmlhttp://www.shnenglu.com/Daywei0123/archive/2016/09/11/214272.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/214272.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/214272.htmlcmake学习(fn)Q一Q静(rn)态库与动态库构徏

(.so)׃n库,shared objectQ节省空_(d)在运行时去连接,如果执行机器上没有这些库文g׃能执行?br />(.a)?rn)态库,archiveQ静(rn)态库和程序化Z体,不会(x)分开?br />通过 ldd命o(h)可以查看一个可执行E序所依赖的的׃n库?br />使用环境变量LD_LIBRARY_DIRECTORY可以指定׃n库位|?/p>


一、编译共享库Q?
ADD_LIBRARY(hello SHARED ${SHARED_LIBRARY})

二、添加静(rn)态库Q?br />ADD_LIBRARY(hello STATIC ${STATIC_LIBRARY})
因ؓ(f)默认规则是不能有相同名字的共享库与静(rn)态库Q所以当生成?rn)态库的时候(so后缀Q,׃n库会(x)被删除,因ؓ(f)只能允许一个名字存在,相同名字的会(x)被替代(helloQ,所以需要通过SET_TARGET_PROPERTIES()来解册个问题,例子Q?br />SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
cmake在构Z个target的时候,?x)删除之前生成的targetQ一h通过讄SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)来达到目?br />三、动态库的版本号Q?br />同样是通过SET_TARGET_PROPERTIES()来设|?br />SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
VERSIONQ动态库版本
SOVERSIONQAPI版本
最后生成的l果是:(x)
libhello.so.1.2
libhello.so.1->libhello.so.1.2
libhello.so->libhello.so.1
四、安装:(x)
INSTALL(TARGETS hello hello_static
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
INSTALL(TARGETS hello.h
DESTINATION include/hello)
其他常用的属?PERMISSIONSQ设|权限;RATTERNQ设|正则表辑ּ


Summary:
ADD_LIBRARY()Q添加一个库Q共享库Q静(rn)态库Q模?br />SET_TARGET_PROPERTIES()Q设|输出名Uͼ版本P解决相同target被删除的问题
GET_TARGET_PROEERTIES()Q与SET功能相对

cmake学习(fn)Q二Q常用变量和常用环境变量
一、变量的引用方式是?#8220;${}”Q在IF中,不需要用这U方式,直接使用变量名即?
二、自定义变量使用SET(OBJ_NAME xxxx)Q用时${OBJ_NAME}
三、cmake的常用变量:(x)
CMAKE_BINARY_DIR,PROJECT_BINARY_DIR,_BINARY_DIRQ?br />q三个变量内容一_(d)如果是内部编译,指的是工程的顶U目录,如果是外部编译,指的是工程~译发生的目录?br />CMAKE_SOURCE_DIR,PROJECT_SOURCE_DIR,_SOURCE_DIRQ?br />q三个变量内容一_(d)都指的是工程的顶U目录?br />CMAKE_CURRENT_BINARY_DIRQ外部编译时Q指的是target目录Q内部编译时Q指的是目录
CMAKE_CURRENT_SOURCE_DIRQCMakeList.txt所在的目录
CMAKE_CURRENT_LIST_DIRQCMakeList.txt的完整\?br />CMAKE_CURRENT_LIST_LINEQ当前所在的?br />CMAKE_MODULE_PATHQ如果工E复杂,可能需要编写一些cmake模块Q这里通过SET指定q个变量
LIBRARY_OUTPUT_DIR,BINARY_OUTPUT_DIRQ库和可执行的最l存攄?br />PROJECT_NAMEQ你猜~~

 

四、cmake中调用环境变?br />1.Using $ENV{NAME} : invoke system environment varible.
We can use "SET(ENV{NAME} value)" as well. note that the "ENV" without "$".
2.CMAKE_INCLUDE_CURRENT_DIR equal to INCLUDE_DIRECTORY(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})


五、其他的内置变量
1.BUILD_SHARED_LIBS:set the default value when using ADD_LIBRARY()
2.CMAKE_C_FLAGS: set compiler for c language
2.CMAKE_CXX_FLAGS: set compiler for c++ language


六、区分debug和release
在工E目录下Qcmake -DCMAKE__BUILD_TYPE=DEBUG(RELEASE)Q再执行make


七、指定编?2bit?4bitE序
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")

cmake学习(fn)Q三Q常用指?/span>

一、基本指令:(x)
INCLUDE_DIRECTORIES(${includedir}) #-I?br />LINK_DIRECTORIES(${libdir}) #-L
TARGET_LINK_LIBRARIES(helloworld ${linkflags}) #-l
ADD_DEFINITIONS(${cflags}) #-D
 
1、ADD_DEFINATIONSQ向C/CPPd宏定义,相当于gcc中的-DQ参C间用I格分割
2、ADD_DEPENDICIES(target_name, depend_name)Q定义target对其他target的依赖关p?br />3、AUX_SOURCE_DIRECTORY(dir VARIBLE)Q把目录下的所有源文g保存在变量中Q基本用来创建源文g列表
4、ADD_EXECUTABLEQ指定目录,生成执行文g
5、EXEC_PROGRAMQ外部调用指令,可移执行M外部命o(h)Q后面加参数Q例子如下:(x)
EXEC_PROGERAM(ls ARGS"*.c" OUTPUT_VARIBLE LS_OUTPUT RETURN_VALUE LS_RVALUE)
IF(not LS_RVALUE)
MESSAGE(STATUS "xxx")
ENDIF(not LS_RVAULE)
PS.q里执行ls *.c指o(h)Q执行成功的话,q回0?br />6、FILE指o(h)Q?br />FILE(WRITE file_name "content")
FILE(APPEND file_name "content")
FILE(READ file_name varible)
FILE(WRITE file_name "content")
7、FIND_pd指o(h)Q?br />LIBRARY( name path)Q?br />FIND_LIBRARY(Xorg X11 /usr/lib64)
IF(not Xorg)
MESSAGE(STATUS "no Xorg")
ENDIF(not Xorg)
FILE( name path)
PATH( name path)
PROGRAM( name path)
PACKAGE( [major.minor][QUIET][NO MODULE][[REQUIRED][COMPONTS][componts....]])
最后一条,用来调用攑֜CMAKE_MODULE_PATH下的Find.cmake模块Q也可以自定义Find模块
首先通过SET(CMAKE_MODULE_PATH /home/...)来指定位|?/p>

8、控制指令:(x)
IF(expression)QELSE(expression)QENDIF(expression)
express举例Q?br />否定Q空Q?QNQNOQOFFQFALSEQNOTFOUND或_NOTFOUND
肯定QCOMMAND cmdQEXISTS dir/fileQvariable MARCHES regex{等{等q有很多~~~随用随查?/p>


cmake学习(fn)Q四Q模块的使用和自定义模块

FIND_PACKAGE
每一个模块都?x)生如下变?br />_FOUND
_INCLUDE_DIR
_LIBRARY or _LIBRARIES
如果_FOUND为真Q把_INCLUDE_DIR加入到INCLUDE_DIRECTORIES中,_LIBRARY加入到TARGET_LINK_LIBRARIES中?/p>

~写属于自己的FindHello模块Q?br />1.FIND_PATH(HELLO_INCLUDE_DIR hello.h /usr/include/hello /usr/local/include/hello)
2.FIND_LIBRARY(HELLO_LIBRARY_DIR NAMES hello PATH /usr/lib /usr/local/lib)
  IF(HELLO_INCLUDE_DIR AND HELLO_LIBRARY)
  SET(HELLO_FOUND TRUE)
  ENDIF(HELLO_INCLUDE_DIR)
3.FIND_PACKAGE([major.minor][QUIET][NO_MODULE]
[[REQUIRED|COMPONENTS][componets...]])
QUIET参数Q去掉输Z?br />REQUIRED参数Q共享库是否是工E必ȝQ如果是必须的,那么找不?br />如果在src中想调用hello模块中的内容
FIND_PACKAGE(HELLO)
Z(jin)可以让工E找到FindHELLO.cmake
在主工程的CMakeList.txt中,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_PATH}/cmake)
通过讄FIND_PACKAGE(HELLO QUIET)可以L输出信息

Cmake CMAKE_BUILD_TYPE specification

That’s because no build type has been specified to CMake. The build type is a feature most IDE have, it allows you to compile your program in “debug” mode, for easily single-stepping through it with a debugger, or in “release” mode, with speed optimization enabled.

To fix this you simply need to specify a build type in the CMakeLists.txt file, in this way:


if( NOT CMAKE_BUILD_TYPE )
  set( CMAKE_BUILD_TYPE Debug CACHE STRING
       "Choose the type of build, options are: None Debug Release RelWithDebInfo
MinSizeRel."
       FORCE )
endif()

when cmake is run without specifying the build type using -D CMAKE_BUILD_TYPE, it is the Debug mode that is selected as the default.


 



Daywei 2016-09-11 22:52 发表评论
]]>
SDL认识http://www.shnenglu.com/Daywei0123/archive/2016/06/28/213813.htmlDayweiDayweiMon, 27 Jun 2016 16:17:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2016/06/28/213813.htmlhttp://www.shnenglu.com/Daywei0123/comments/213813.htmlhttp://www.shnenglu.com/Daywei0123/archive/2016/06/28/213813.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/213813.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/213813.html
然后说说从个度上看SDL的特炏V?br />
1.跨^台?/strong>确实实是跨?jin)N个^収ͼ甚至包括NDSq种q_。有?jin)SDLQ你甚至可以在windows、linux、Android上Q意移植你的游戏。当?dng)前提是你目标q_的编译器认识你的代码(K?#9661;K?”。有?jin)SDL泥甚臛_以只用c语言开发安卓游戏哟?br />
2.开源?/strong>

3.SDL2.0l图效率很高。事实上相较之SDL1.2我个人比较喜ƢSDL2.0的原因也是在此。个人感觉(其实我没看过源码QSDL1.2应该是个跟当q的DirectDraw差不多的东西Q像素填充什么的Q有相当E度上是要磨CPU的。而SDL2.0从绘图方式上革C(jin)Q抛弃了(jin)之前的surface与clip的模式,把实际绘制的东西改ؓ(f)?jin)TextureQ而把之前的surface改ؓ(f)?jin)创建Texture的一个(f)时环节。而texureQ顾名思义Q其实就是DirectX、OpenGLq些底层?Dg加速API的脓(chung)图?br />
当下DirectX、OpenGL标准下的昑֍的渲染管U无非就是:(x)1.把顶点(可以理解成坐标)(j)传给昑֍ ?.把texture传给昑֍?3.告诉昑֍怎么处理q些数据QshaderQ?4.昑֍把东西给你显C出来。而基于DirectX、OpenGL(Udq_是OpenGL ES)的SDL2.0Q正是恰好地利用?jin)当下显卡的能力?br />
4.SDL可以用作3D囑փ引擎和底层DirectX/OpenGL API的中间层。当?dng)其实如果把SDLq样用的话,那就真是很薄的一层了(jin)Q)(j)

5.易用。这是相对而言的,比如在windows上,你用?jin)SDLq个库之后,基本׃用去理会(x)Windows那些又臭又长用不着的参数又多的API?jin)。我不是在讨Z仰问题也不是要诋毁windowsQ我是在客观陈述windows api那个要初始化一个窗口必要?00行代码的讑֮实在是打d学者积极性的事实?br />
SDL_image、SDL_ttf、SDL_mixer、SDL_net 外部扩展库,也是不错的选择?/span>

性能没有试Q仅从写代码角度上来_(d)个h感觉2.0操作给弄得复杂?jin)?br />
1.2---------------------------------------
只有SDL_Surface的概念,屏幕是surfaceQ图片,文字{都是surfaceQ?br />只要准备好的各U图片,贴到屏幕里去(SDL_BlitSurface)Q再刷一下屏q?SDL_Flip全局的、或SDL_UpdateRect局部的)ok?jin)。。?br />
SDL_Init(SDL_INIT_EVERYTHING);

SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
SDL_Surface* bmp = SDL_LoadBMP("back.bmp");
SDL_BlitSurface(bmp, 0, screen, 0);
SDL_Flip(screen);

while(SDL_WaitEvent(&e)) {
switch(e.type) {
case SDL_QUIT:
return;
}
}
SDL_Quit();
2.0---------------------------------------
整出?jin)SDL_Window,SDL_Renderer,SDL_Texture新的3个东ѝ?br />q且我要M张图Q先要得到surfaceQ然后{换ؓ(f)textureQ再临时贴到rendererQ最后才刷屏?br />
SDL_Init(SDL_INIT_EVERYTHING);

SDL_Window* window = SDL_CreateWindow("hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
SDL_Surface* surface = SDL_LoadBMP("back.bmp");
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, 0, 0);
SDL_RenderPresent(renderer);

while(SDL_WaitEvent(&e)) {
switch(e.type) {
case SDL_QUIT:
return;
}
}
SDL_Quit();

其实Q我真心(j)不觉得提出SDL_Window,SDL_Renderer,SDL_Textureq些概念先进性在哪里Q可能是与openGL的概念保持一致吧?br />而且从维护的角度出发Q不sdl2.0性能提升?jin)多,如果接口本n不需要改动,不是更加好么Q?br />
---------------------------------------------
最后我发现Q同h渲染的窗?br />1.2用SDL_Flip(screen);之后被其他窗口挡住之后,回来画面q是在的Q?br />2.0用SDL_RenderPresent(renderer);之后被其他窗口挡住之后,回来画面׃在了(jin)Q?

Daywei 2016-06-28 00:17 发表评论
]]>
OpenCV 使用问题记录http://www.shnenglu.com/Daywei0123/archive/2015/12/06/212423.htmlDayweiDayweiSun, 06 Dec 2015 04:20:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2015/12/06/212423.htmlhttp://www.shnenglu.com/Daywei0123/comments/212423.htmlhttp://www.shnenglu.com/Daywei0123/archive/2015/12/06/212423.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/212423.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/212423.html阅读全文

Daywei 2015-12-06 12:20 发表评论
]]>
SQL使用记录http://www.shnenglu.com/Daywei0123/archive/2015/03/17/210079.htmlDayweiDayweiTue, 17 Mar 2015 07:43:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2015/03/17/210079.htmlhttp://www.shnenglu.com/Daywei0123/comments/210079.htmlhttp://www.shnenglu.com/Daywei0123/archive/2015/03/17/210079.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/210079.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/210079.html阅读全文

Daywei 2015-03-17 15:43 发表评论
]]>
Exceptional C++ MW记2http://www.shnenglu.com/Daywei0123/archive/2014/08/22/208095.htmlDayweiDayweiFri, 22 Aug 2014 07:00:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2014/08/22/208095.htmlhttp://www.shnenglu.com/Daywei0123/comments/208095.htmlhttp://www.shnenglu.com/Daywei0123/archive/2014/08/22/208095.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/208095.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/208095.html
如果只需要流的前|声明,应该优先使用#include<iosfwd>

只需要前|声明时Q绝不要?include包含相应的头文g?br />
如果使用聚合关系已l够,׃要用ѝ?br />
要避免用内联或者复杂的调整Ҏ(gu)Q除非通过性能分析证明q确实是必要的?br />
正确使用名字I间。如果将一个类攑օ名字I间Q那么同时要保证这个类的所有辅助函数和q算W函C攑օ相同的名字空间。否则,你将在代码中发现奇怪的l果?img border="0" alt="" src="http://www.shnenglu.com/images/cppblog_com/daywei0123/内存区域.jpg" width="1708" longdesc="" height="2000" />
要理解这五种不同cd的内存,?jin)解他们Z么是不同的,以及(qing)他们各自的行为又是怎么P(x)栈(自动变量Q、自由存储(new/deleteQ、堆Qmalloc/freeQ、全局Q静(rn)态变量、全局变量、文件作用域变量{)(j)、常量数据(字符串常量等Q?br />
优先使用自由存储Qnew/deleteQ,避免使用堆(malloc/freeQ?br />
对于“?#8221;?#8220;自由存储”q行区分Q这一点很重要Q因为在C++标准中有意避开?jin)这两种cd的内存是不是相关的这个问题。例如,当通过Q:(x)operator delete()函数来释攑ֆ存时Q在C++标准?8.4.1.1中,最后一Ҏ(gu)q样的:(x)
“ 在C++标准中ƈ没有规定Q在哪些情况下,在通过operator delete回收的存储空间中Q有一部分或者全部的控g可以再随后调用operator new或者callocQmalloc以及(qing)realloc{函数时被重新分配,q些函数的声明时?lt;cstdlib>中?#8221;
而且Q在C++标准中也没有规定Qnew/delete是否需要通过malloc/free来实现。不q,在C++标准20.4.6节的W?D和W?D中规定?jin),malloc/free一定不能用new/delete来实玎ͼ(x)“calloc、malloc和realloc函数不会(x)通过调用::operator new()来分配存储空间。函数freeQ)(j)不会(x)通过调用::operator delete() 来释攑ֆ存?#8221;

如果在类中定义了(jin)new和delete中的L一个运符函数Q那么一定要同时定义另外一个?br />
通常应该昑ּ地将函数operator new ()和operator delete()声明为静(rn)态函数。他们永q都不能佉K?rn)态成员函数?br />
永远都不要通过多态的方式处理数组?br />
优先选择使用vector或者dequeQ而不是数l?br />
在编写拷贝赋D符函数Ӟ永远都不要指望能够通过对自我赋D行检来保证函数的正性;应该在拷贝赋D符函数中?#8220;创徏临时对象q进行交?#8221;的惯用法Q这U方法不仅是异常安全的,而且在处理自我赋值时也是安全的?br />
可以自我赋值检作ZU优化手D,以避免不必要的工作,q是正确地做法?br />
不仅要避免编写类型{换运符函数Q而且q要避免~写隐式的构造函数?br />
量~写异常安全的代码。在~写代码时应该始l遵循:(x)即在出现异常时Q资源仍然能够被正确地释放,q且数据也L处于一致的状态?br />
避免使用语言中那些不常用的特性,而应该用最单ƈ且有效的技术?br />
拯初始化过E绝不是赋DE,因此在初始化中永q都不会(x)调用函数T::operator=()。是的,我知道在初始化语句中有一?#8220;=”W合Q但不要被它qh。它只是从C语言中沿用过来的一U语法,q不代表赋D?br />
如果可能的话Q优先?#8220;T t(u);”q种形式Q而不?#8220;T t=u;”的Ş式。通常Q能能够时候后者的地方Q都可以使用前者,q且使用前者还有更多的好处——例如Q可以带多个参数?br />
在函数声明中Q如果参数是以传值方式来传递的Q则不要使用const。而如果在q个函数的定义中Q参数是不能被修改的Q那么应该用const?br />
对于不是内置cd的返回值来_(d)当用返回值的方式而不是返回引用的方式Ӟ应该优先选择q回const倹{?br />
const 和mutable都是你的朋友

优先使用新Ş式的cd转换?br />
不要通过cd转换L帔R属性,而应该用mutable?br />
避免使用向下的类型{换?br />
优先通过引用方式来传递对象参敎ͼ而不是传值方式,q且在所有可能的地方都用const?br />
避免使用内联Q除非从性能的分析上来看实有必要这么做?br />
避免使用全局变量或者静(rn)态变量。如果必M用,那么一定要特别注意q些变量的初始化序?br />
在构造函数的初始化列表中Q应该把 基类按照他们在类定义中出现的先后序q行排列?br />
在编写代码时Q永q都不应该依赖函数参数的求值顺?img src ="http://www.shnenglu.com/Daywei0123/aggbug/208095.html" width = "1" height = "1" />

Daywei 2014-08-22 15:00 发表评论
]]>
Exceptional C++ MW记1http://www.shnenglu.com/Daywei0123/archive/2014/08/22/208093.htmlDayweiDayweiFri, 22 Aug 2014 03:50:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2014/08/22/208093.htmlhttp://www.shnenglu.com/Daywei0123/comments/208093.htmlhttp://www.shnenglu.com/Daywei0123/archive/2014/08/22/208093.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/208093.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/208093.htmll对不要Ҏ(gu)效的q代器执行解引用QdereferenceQ操?br />
用于不要异常安全性放在事后考虑。异常安全性会(x)影响到类的设计。它永远都不?#8220;只是一个实现细?#8221;?br />
在传递对象参数时Q选择const&方式而不是传值方式?br />
对于E序q行中不?x)改变的|应该预先计算q保存v来备用,而不是重复地创徏对象Q这是没有必要的?br />
通常Qؓ(f)?jin)保持一致性,应该使用前置递增来实现后|递增Q否则,当其他用户在使用你的cLQ可能会(x)得到奇怪结果?br />
优先选择使用前置递增。只有在需要初始值时Q才使用后置递增?br />
在进行隐式类型{换时Q要注意在{换过E中创徏?临时对象。要避免q个问题Q一个好办法是可能地通过昑ּ的方式来构造对象,q免编写类型{换运符?br />
C对象的生存期。永q,永远Q永q都不要q回指向局部对象的指针或引用;它们没有M用处Q因Z调代码无法跟t它们的有效性,但却可能?x)试图这么做?br />
可能地重用代码——其是标准库中的代码——而不是自己去~写代码Q这h快、更Ҏ(gu)Q也更安全?br />
如果在函C不打处理所抛出的异常,那么应该异常{发给能够q行处理的上层调用者?br />
在编写代码时应该始终遵@Q即使在出现异常Ӟ资源仍然能够被正地释放Qƈ且数据也L处于一致的状态?br />
遵@标准的异常安全规则:(x)永远不要在析构函数、重载运符函数operator delete()或者operator delete[]()中抛出异常; 在编写每个析构函数和内存释放函数Ӟ要假讑֭在着“throw()”q样的异常规范?br />
遵@标准的异常安全性规则:(x)在每个函CQ要所有可能会(x)抛出异常的代码单独放在一Pq且对这些代码进行安全处理。然后,当你认q些代码执行的工作都已经成功地完成时Q才可以使用不会(x)抛出异常的操作来修改E序的状态?br />
永远都不要到最后才实现异常安全性。异常安全性会(x)对类的设计生媄(jing)响。它永远都不?#8220;只是一个实现细?#8221;?br />
优先考虑实现内聚。要努力使每D代?#8212;—每个模块、每个类、每个函?#8212;—都只有单一的,q且是明定义的功能?br />
“异常不安?#8221;L?#8220;拙劣的设?#8221;l伴的。如果程序的设计逻辑清晰Q那么即使有一D代码不是异常安全的Q一般来说也不会(x)有太大问题,q且可以很简单地q行修正。但如果有一D代码由于设计问题而不能被~写成异常安全的Q我们通常都会(x)认ؓ(f)q个设计时拙劣的。下面是两个拙劣设计的示例?br />CZ1Q如果在一个函C需要实C个不同的功能Q那么这个函数很难被~写成异常安全的?br />CZ2Q如果在拯赋D符函数中必d自我赋D行检,那么q个函数也可能不是完全异常安全的

遵@标准的异常安全性规则:(x)?#8220;获得资源也就意味着初始?#8221;q种模式来分资源的所有权和资源的理权?br />
在进行设计中Q要始终牢记重用性?br />
优先采用“ a op=b;”q种写法Q而不?a = a op b;"Q这里的op表示某个q算W)(j)。这U写法更为清晎ͼ效率也高?br />
如果定义?jin)某个运符Q例如,operator+Q,那么通常q应该同时定义与q个q算W相对应的赋D符Q例如,operator+=Q。ƈ且用后者来实现前者。而且Q还应该l护op和op=之间的自然关pR?br />
在C++标准中规定:(x)q算W?Q(Q,[]?>必须被定义ؓ(f)成员函数Q而在cM定义的new,new [],delete和delete[]{运符函数必须是静(rn)态成员函数。对于其他的q算W函敎ͼ(x)
     如果q算W函数是用于I/O的opeator>>或者operator<<Q或者如果运符函数需要对其左操作数进行类型{换,或者运符函数可以通过cȝ公有接口来实玎ͼ那么这个函数定义ؓ(f)非成员函敎ͼ在前两种情况中,如果需要的话也可以被定义ؓ(f)友元函数Q;如果q算W函数需要实现虚函数的行为,那么增加一个虚函数来提供虚函数的行为,q用q个虚成员函数来实现q算W函数否则将预算富函数定义ؓ(f)成员函数?br />
在函数opeator>>和operator<<中应该始l返回对对象的引用?br />
基cȝ析构函数定义函数Q除非你能保证,永远都不?x)有人通过指向基类的指针来删除zcȝ对象Q?br />
如果在派生类中定义的函数与基cM的函数有相同的名字,q且你不想隐藏基cM函数Q那么应通过using声明语句基cȝq个函数引入到派生类的作用域中?br />
永远不要改变被覆盖的基类函数中的默认参数倹{?br />
除了(jin)对真正的Liskov IS-A和W(xu)ORKS-LIKE-A关系q行建模之外Q永q都不要使用共有l承。所有被覆盖的成员函C能超q实际需求的范围Q同时也不能于q个范围?br />
使用公有l承的目的是重用代码Q编写以多态的方式使用基类对象的代码)(j)Q而重用(基类中的Q代码ƈ不一定要使用公有l承?br />
?#8220;is implemented in terms of”q种关系建模Ӟ应该优先选择成员关系/包含的方式,而不是私有承的方式。只有非用承不可时Q才应该使用U有l承——也就是说Q当需要访问保护成员或者需要覆盖虚函数Ӟ才用私有ѝ永q都不要只是Z(jin)代码重用而用共有ѝ?br />
对于q泛使用的类Q应该优先用编译器防火墙这U惯用法Q也叫做Pimpl惯用法)(j)来隐藏实现细节,通过一个不透明的指针(指向一个进行了(jin)前置声明但又没有定义的类Q来保存U有成员Q包括状态变量和成员函数Q,声明q个指针时可采用“struct XxxxImpl* pImpl;XxxxImpl* pimpl_;”q样的Ş式。例如:(x)“class map{ private :struct MapImpl;MapImpl* pimpl_;}”

包含Q也可以叫做“聚合”Q?#8220;分层”Q?#8220;HAS-A”或?#8220;委托”。优先选择包含而不是承,对于IS-IMPLEMENTED-IN-TERMS-OFq种关系建模Ӟ应该优先考虑使用包含Q而不是ѝ?br />



Daywei 2014-08-22 11:50 发表评论
]]>
从缺陷中学习(fn)C/C++http://www.shnenglu.com/Daywei0123/archive/2014/07/24/207780.htmlDayweiDayweiThu, 24 Jul 2014 07:29:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2014/07/24/207780.htmlhttp://www.shnenglu.com/Daywei0123/comments/207780.htmlhttp://www.shnenglu.com/Daywei0123/archive/2014/07/24/207780.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/207780.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/207780.html有符号int与无W号int比较的后?/strong>
int i = -1;
unsigned 
int ud=1;
if(i < ud)
{
    printf(
"true");
}

else
{
    printf(
"false");
}
一看结果应该是打印出trueQ但事实却是false?br />signed int 型变量被转换成unsigned int型变量?1转换成unsigned int的结果是一个非常巨大的正整敎ͼ32位系l上??2ơ方-1Q,需要进行强转ؓ(f)int型?br />
位域变量
struct data
{
int flag:1;
int other:31;
}
;
printf(
"data size %d\n",sizeof(data));
data test1;
test.flag
= 1;
if(test.flag ==1)
{
printf(
"true");
}

else
{
printf(
"false");
}
int的位域变量,而用一个bit表示intӞq一位是用来表示有符号位的,带符L(fng)一个bit的位域变量的取D围是0?1.无符L(fng)一个bit的位域变量的取D围是0?Q故1赋给flag时会(x)出现溢出Qflag变ؓ(f)-1.
ReferenceQ?a >http://wenku.baidu.com/view/670eff4bf7ec4afe04a1dfd7.html

Daywei 2014-07-24 15:29 发表评论
]]>
Effective STL(5)——算?/title><link>http://www.shnenglu.com/Daywei0123/archive/2014/06/25/207410.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Wed, 25 Jun 2014 09:06:00 GMT</pubDate><guid>http://www.shnenglu.com/Daywei0123/archive/2014/06/25/207410.html</guid><wfw:comment>http://www.shnenglu.com/Daywei0123/comments/207410.html</wfw:comment><comments>http://www.shnenglu.com/Daywei0123/archive/2014/06/25/207410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Daywei0123/comments/commentRss/207410.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Daywei0123/services/trackbacks/207410.html</trackback:ping><description><![CDATA[<div><span style="font-size: 18pt">1.保目标I间_?br /></span><br /><span style="font-size: 18pt">2.?jin)解各种与排序有关的选择</span><br /><span style="font-size: 18pt">  </span><span style="font-size: 14pt">如果需要对vector、string、deque或者数l中的元素执行一ơ完全排序,那么可以使用sort或者stable_sort?/span><br /><span style="font-size: 14pt">  如果有一个vector、string、deque或者数l,q且只需要对{h(hun)性最前面的n个元素进行排序,那么可以使用partial_sort?/span><br /><span style="font-size: 14pt">  如果有一个vector、string、deque或者数l,q且需要找到第n个位|上的元素,或者,需要找到等h最前面的n个元素但又不必对qn个元素进行排序,那么Qnth_element正是你所需要的函数?/span><br /><span style="font-size: 14pt">  如果需要将一个标准序列容器中的元素按照是否满x个特定的条g区分开来,那么Qpartition和stable_partition可能正是你所需要的?/span><br /><span style="font-size: 14pt">  如果你的数据在一个list中,那么你仍然可以直接调用partition和stable_partition法Q可以用list::sort来替代sort和stable_sort法。但是,如果你需要获得partial_sort或nth_element法的效果,那么Q正如前面我所提到的那P你可以有一些简z的途径来完成这Q务?br /></span><br /><span style="font-size: 18pt">3。如果确实需要删除元素,则需要在removeq一cȝ法之后调用erase?br /></span><br /><span style="font-size: 18pt">   </span><span style="font-size: 14pt">remove不是真正意义上的删除Q因为它做不到?br /></span><br /><span style="font-size: 18pt">4.对包含指针的容器使用removeq一cȝ法时要特别小?j)。会(x)D资源泄露?br /></span><br /><span style="font-size: 18pt">5.?jin)解哪些法要求使用排序的区间作为参数?br /></span><br /><span style="font-size: 18pt">6.通过mismatch或lexicographical_compare实现单地忽略大小写的字符串比?br /></span><br /><span style="font-size: 18pt">7.理解copy_if法的正实?br /></span><br /><span style="font-size: 18pt">8.使用accumlate或者f(xi)or_eachq行区间l计?/span></div><img src ="http://www.shnenglu.com/Daywei0123/aggbug/207410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Daywei0123/" target="_blank">Daywei</a> 2014-06-25 17:06 <a href="http://www.shnenglu.com/Daywei0123/archive/2014/06/25/207410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Effective STL(4)——P代器http://www.shnenglu.com/Daywei0123/archive/2014/06/13/207272.htmlDayweiDayweiFri, 13 Jun 2014 07:00:00 GMThttp://www.shnenglu.com/Daywei0123/archive/2014/06/13/207272.htmlhttp://www.shnenglu.com/Daywei0123/comments/207272.htmlhttp://www.shnenglu.com/Daywei0123/archive/2014/06/13/207272.html#Feedback0http://www.shnenglu.com/Daywei0123/comments/commentRss/207272.htmlhttp://www.shnenglu.com/Daywei0123/services/trackbacks/207272.html1.iterator 优先于const_iterator、reverse_iterator?qing)const_reverse_iterator

2.使用distance和advace容器的const_iterator转换成iterator

3.正确理解由reverse_iterator的baseQ)(j)成员函数所产生的iterator的用法?br />
4.对于逐个字符的输入请考虑使用istreambuf_iterator


Daywei 2014-06-13 15:00 发表评论
]]>
Effective STL(3)——关联容?/title><link>http://www.shnenglu.com/Daywei0123/archive/2014/05/16/206995.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Fri, 16 May 2014 08:30:00 GMT</pubDate><guid>http://www.shnenglu.com/Daywei0123/archive/2014/05/16/206995.html</guid><wfw:comment>http://www.shnenglu.com/Daywei0123/comments/206995.html</wfw:comment><comments>http://www.shnenglu.com/Daywei0123/archive/2014/05/16/206995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Daywei0123/comments/commentRss/206995.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Daywei0123/services/trackbacks/206995.html</trackback:ping><description><![CDATA[<div><span style="font-size: 18pt">1.理解相等QequalityQ和{h(hun)QequivalenceQ的区别<br /></span><br /><span style="font-size: 14pt">相等的概忉|Zoperator==的。等价关pL?#8220;在已排序的区间中对象值得相对序”为基的。如果从每个标准兌容器的排列顺序来考虑{h(hun)关系Q那么着是有意义的。标准关联容器室Z{h(hun)而不是相{的?/span><span style="font-size: 14pt">标准兌容器L保持排列序的,所以每个容器必L一个比较函敎ͼ默认lessQ来军_保持怎样的顺序。等h按照</span><u style="font-size: 14pt"><strong>比较函数子?/strong></u><span style="font-size: 14pt">因此Q标准关联容器的使用者要为所使用的每个容器指定一个比较函敎ͼ用来军_如何排序Q。如果该兌容器使用相等来决定两个对象是否有相同的|那么每个兌容器除了(jin)用于排序的比较函数外Q还需要另一个比较函数来军_两个值是否相{(默认情况下,该比较函数应该是equal_toQ但有趣的是equal_to从来没有被用做STL的默认比较函数。当STL中需要相{判断时Q一般的惯例是直接调用operator==。比如,非成员函数find法是q么做的Q?br /></span><br /><span style="font-size: 18pt">2.为包含指针的兌容器指定比较cd<br /></span><br /><span style="font-size: 14pt">whyQ第一条已l说明关联容器是要排序。每当你要创建包含指针的兌容器Ӟ一定要CQ容器将?x)按照指针的D行排序。一般是不是你希望的Q所以你几乎要创q函数子类作ؓ(f)该容器的比较cd?br /></span><br /><span style="font-size: 18pt">3.L让比较函数在{值情况下q回false<br /></span><br /><span style="font-size: 14pt">比较函数的返回D明的是按照该函数定义的排列顺序,一个值是否在另一个之前。相{的g来不?x)有前后序关系Q所以,对于相等的|比较函数应该始终q回false?br /></span><br /><span style="font-size: 18pt">4.切勿直接修改set或multiset中的键?br /></span><br /><span style="font-size: 18pt">5。考虑用排序的vector替代兌容器<br /><br /></span><span style="font-size: 14pt">在排序的vector中存储数据可能比在标准关联容器中存储同样的数据要耗费更少的内存,而考虑到页面错误的因素Q通过二分搜烦(ch)法来查找一个排序的vector可能比查找一个标准关联容器要更快一些?/span><span style="font-size: 18pt"><br /></span><br /><span style="font-size: 18pt">6.当效率至关重要时Q请在map::operator[]与map::insert之间谨慎做出选择<br /></span><br /><span style="font-size: 14pt">map::operator[]的设计目的是Z(jin)提供“d和更?#8221;的功能。添加一个新元素最好选后者insert?br /></span><br /><span style="font-size: 18pt">7.熟?zhn)非标准的散列容器?/span></div><img src ="http://www.shnenglu.com/Daywei0123/aggbug/206995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Daywei0123/" target="_blank">Daywei</a> 2014-05-16 16:30 <a href="http://www.shnenglu.com/Daywei0123/archive/2014/05/16/206995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.rcipbrdgydr.cn" target="_blank">AƷһþ</a>| <a href="http://www.tr78.cn" target="_blank">þAV뾫Ʒ</a>| <a href="http://www.sanbaotong.cn" target="_blank">ɫɫۺϾþҹҹ</a>| <a href="http://www.domino111.com.cn" target="_blank">ʵҶ԰׾ʾþ</a>| <a href="http://www.vfql.cn" target="_blank">þþƵ</a>| <a href="http://www.zenavo.cn" target="_blank">þô㽶</a>| <a href="http://www.360shouji.net.cn" target="_blank">þþһƷ99þþƷ66</a>| <a href="http://www.i9tao8.cn" target="_blank">vaĻþ </a>| <a href="http://www.wltceiling.cn" target="_blank">˼˼þþƷ</a>| <a href="http://www.lenglie.cn" target="_blank">ŷþþþþþѡ9999</a>| <a href="http://www.heilai.cn" target="_blank">ݺݾþۺ˲</a>| <a href="http://www.carmap.com.cn" target="_blank">þ99þëƬһ</a>| <a href="http://www.bandetek.cn" target="_blank">91Ʒþþþþù۲</a>| <a href="http://www.gjznet.cn" target="_blank">ۺþþ</a>| <a href="http://www.duange.com.cn" target="_blank">AVɫۺϾþAVɫۺ </a>| <a href="http://www.ssc959.cn" target="_blank">avԾþþþa鶹 </a>| <a href="http://www.xiwangchuang.cn" target="_blank">þþĻձ</a>| <a href="http://www.30ww.cn" target="_blank">޹Ʒþ</a>| <a href="http://www.timng.cn" target="_blank">þþþ޹</a>| <a href="http://www.84993.com.cn" target="_blank">ݺݾþ</a>| <a href="http://www.musqm.cn" target="_blank">ڵþ</a>| <a href="http://www.gougou123.cn" target="_blank">99þۺϾƷ</a>| <a href="http://www.yzx777.cn" target="_blank">þˬˬAVƬ</a>| <a href="http://www.wannengsou.cn" target="_blank">˾þó˳ۺ222</a>| <a href="http://www.rahd.cn" target="_blank">޹ƷþõӰŷ</a>| <a href="http://www.hanxuefs.com.cn" target="_blank">ݺݺݾþ</a>| <a href="http://www.chipsummit.cn" target="_blank">㽶97þ</a>| <a href="http://www.deartaobao.cn" target="_blank">þҹƵ</a>| <a href="http://www.uuribao.com.cn" target="_blank">Ʒþþþþ</a>| <a href="http://www.woyaopeizi.cn" target="_blank">þü޾Ʒ?V</a>| <a href="http://www.diycook.cn" target="_blank">91鶹Ʒ91þþ</a>| <a href="http://www.y0ing.cn" target="_blank">һaƬþëƬ</a>| <a href="http://www.176zfblp.cn" target="_blank">רþ</a>| <a href="http://www.ctihf.com.cn" target="_blank">þþŮ붯ȺëƬ</a>| <a href="http://www.caoshai.cn" target="_blank">˾Ʒþ޸岻 ˾Ʒþ޸岻 ˾Ʒþ </a>| <a href="http://www.0513act.cn" target="_blank">þAVij</a>| <a href="http://www.2218335.cn" target="_blank">ۺ޾þһƷ</a>| <a href="http://www.5656936.cn" target="_blank">91ƷۺϾþĻþһ</a>| <a href="http://www.ditiewang.com.cn" target="_blank">þۺϸۺϾþ</a>| <a href="http://www.itmr.com.cn" target="_blank">þAv뾫Ʒϵ</a>| <a href="http://www.wtxpxt.cn" target="_blank">ŷԴƬxxxxxþþ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>