??xml version="1.0" encoding="utf-8" standalone="yes"?> An experimental
profile mode has been added. This is an implementation of
many C++ standard library constructs with an additional analysis
layer that gives performance improvement advice based on
recognition of suboptimal usage patterns. For example,
When instrumented via the profile mode, can return suggestions about
the initial size and choice of the container used as follows:
These constructs can be substituted for the normal libstdc++
constructs on a piecemeal basis, or all existing components can be
transformed via the
q增加了一个新的profile模式Q尚处于试验阶段Q,可以ҎE序q行状态给出关于STL使用的一些优化徏议?br>
参看如下的描qͼ
#include <vector>
int main()
{
std::vector<int> v;
for (int k = 0; k < 1024; ++k)
v.insert(v.begin(), k);
}vector-to-list: improvement = 5: call stack = 0x804842c ...
: advice = change std::vector to std::list
vector-size: improvement = 3: call stack = 0x804842c ...
: advice = change initial container size from 0 to 1024-D_GLIBCXX_PROFILE macro.
Profile mode的提出源?9qCGO的一?a >paperQ作者里边出C华h的名字(Ҏ拼音来判断);作者地址填的昄是Purdue大学的:
Dept. of Comput. Sci., Purdue Univ., West?br>
GCC的Profiler对C++的支持一贯停留在和C同样的水qI׃C++模板机制和OO的存在得很多时候分析profilingl果的意义被大大削弱?br>q个针对STL的profile modeq是很值得期待的?br>
]]>
最q才发现boost的cmake版本已经独立出来了,对于使用cmake的用戯言Q这里是个不错的选择?br>目主页的文很是清晎ͼ最新的版本?.41 (版本号对应的基本是其upstream的boost版本??br>源代码是用gitl织的,对于Linux用户而言更加方便?br>
引用其主上的一句话Q?br>
CMake + GIT +Spinx 实够酷了?br>
~译h可以充分利用强大的CMake了:
git clone git://gitorious.org/boost/cmake.git src
cd src
git checkout <TAG> //TAG==1.41.0.cmake0
mkdir bld
cd bld/
cmake ../如果需要按需~译某些库,只需用make edit_cache修改cache卛_?br>
]]>
只需要在./configure 后边加上 --with-ssl=<path>卛_?br>
开始的时候,没留意这个,因ؓ_略扫描了一?--help, 后边q么说了Q?br>
LIBSSH2 installation (default: /usr/local/lib); when
possible, set the PKG_CONFIG_PATH environment
variable instead of using this option
后来才发?环境变量做幅调整、改动来探测)Q这个default在Solaris上边q不是真的default,必须昄指定?usr/local/ssl,否则扑ֈ的居然是/usr/sfw/?br>
]]>
cmake ..
make

add_library(libname_static STATIC src1 src2)
set_target_properties(libname_static OUTPUT_NAME ${libname})
add_library(libname SHARED src1 src2)
add_subdirectory(sub1)
add_subdirectory(sub2)
add_library(cryptolib SHARED IMPORTED)
#May have different dependent libraries
set(libsuffix ${CMAKE_SYSTEM_NAME}_${CMAKE_SYSTEM_PROCESSOR})
set_target_properties(ssllib PROPERTIES IMPORTED_LOCATION "${project_top_dir}contrib/openssl/lib/libssl-${libsuffix}.so")
set_target_properties(cryptolib PROPERTIES IMPORTED_LOCATION "${project_top_dir}contrib/openssl/lib/libcrypto-${libsuffix}.so")
........................
#other CMakeLists.txt
add_executable(myExe src1 src2)
target_link_libraries(myExe ssllib cryptolib)
]]>
GNU autotools提供了一个不错的选择Q可以做到组l工具链来生成所需的MakefileQ但~陷是学习v来比较麻烦,而且模版文g写v来比较费劌Ӏ老实说我跟Makefile打了q?q的交道Q几乎没有自己写qautomake脚本Q相反的工作倒是q了不少Q譬如分析生成的Makefileq行q程Q然后模拟自己手写MakefileQ得C个轻爽的定制环境?br>
除了autotoolsQ其实也有不其他的工具Q譬如apache的antQ基于Python的sconsQant在java界是鼎鼎大名了,可惜对c++的支持确实让我感觉很不习惯;sconsL可以嵌入Python代码Q用h也算单,但是惛_现复杂的功能很头疼了,而且q行速度让h挠头?br>
cmake则I补了上述几个工具的诸多缺P
1> 易于学习Q文档易懂,只需牢记以下两个命o卛_Q?br>
cmake --help-command-list
cmake --help-command xxx
cmake --help-variable-list
cmake --help-variable yyy
5> 支持集成ctest/cpack,前者可以方便的做单元测试,后者则可以打包生成tgz/rpm
6> 支持多个生成器,可以生成eclipse/codeblocks/gmake/unix make文gQ甚臛_以生成VC各个版本的dsw/sln.
7> 内嵌语言Q可以自己写函数、宏{?br>
对于l常写小试E序的h来说Q在test目录下加上个CMakeLists.txtQ里边加上几行简单的语句可以方便的以后重复使用了。对于这U情况,手工写的Makefile到依赖这U麻烦的事情往往力不从心Qautomake又太题大作Q而cmake则恰到好处了?br>
对于大型E序Qcmake可以自己定制生成的中间文件和目标文g路径Q有效避免了automake带来的每个目录下生成一大堆文g的弊端,也不需要手工写Makefile?br>最有用的是可以生成多个知名IDE的工E文Ӟ包括Windows下的vc6-vc9.
]]>
现实的情况却是很多项目都是从最初的数千行代码逐步庞大hQ开始的时候可能ؓ了图方便Q加log的方式大多是自己在iostream的基上自己封装一下;{到目扩大数十倍的时候,却发现这U方式很力不从心QLog文g凌ؕ复杂Q难以管理?br>
现有的log工具Q基本是分ؓ两个阵营Q经典的syslog和花哨强大的log4jQ从而衍生出很多个变体。log4j基本已经成ؓ复杂应用E序的log标准了,无奈C++的几个模仿者确各有千秋。我的情冉|Q?br>1>不需要复杂的配置Q甚至不需要配|文Ӟ但修改log消息格式又要很方?br>2>支持自动备䆾功能
3>多线E安?br>4>效率要尽量高
5>不要有其他依?br>
log4cpp很轻易的满了我的要求,只需要用已有的RollingFileAppender准备好后端,创徏PatternLayoutQ一切就可以了;logU别的设|完全和syslog协议一P很直观,打log地方Q调用默认的Category理器取得一个命名的Category,其他是单的调用? log(), debug(), notice(), info(), notice()....
本来最感兴的是log4cxx, Apache的伟大项目,功能也最全,ȝ的是它自带了两个q_库,需要额外依赖;配置文g也要昄准备Q感觉太臃肿了,估计大项目采用的吧?br>
效率上最高的应该是pantheiosle了,据说没开启Log的情况下Qoverhead几乎?Q作者自U效率是log4cxx的数倍,但也依赖于STLSoftQ虽然只有头文gQ?其打包方式也让h想避而远之,q要用作者自己写的版本选择器来选一个合适的库(Win的情况)?br>
q有一个是Boost的logging库,用尽了模板技巧,虽然很炫Q当时没多少用,也没有通过boost 严格的reviewQ虽然是专家写的Q暂时也没时间评估和学习了?br>
]]>
W一步要做的自然是手动编译GCC的源代码了,因ؓ我没有找到Debian版本的升U包Q干脆自׃载,我只需要gcc-core和g++两个包就可以了,一?5MQ一?MQ下载倒是挺顺利,几分钟就OK了,接下来就是编译了。常见的源码~译步骤OK了:
./Configure
make
make install
我遇到的是有两个关于多处理器的开发库依赖Qapt-get很容易就安装上去了?br>
~译的过E就比较漫长了,我的Pentium D 2.8G Dual Corezȝ生忙zM一个小午休的时_h发现q没~译完,不过十分钟之后就发现所有的OK了?br>
TR1的库Qboost的示例比较好Q其?a >W?1?/a>有详l的列表和用法简要说明。参照那个查了一下GCC的头文gQ在
/usr/local/include/c++/4.4.0/tr1/ 里边Q?br>
ls -lh | awk '$8 ~/^[a-z]+$/{print $8}'
array
ccomplex
cctype
cfenv
cfloat
cinttypes
climits
cmath
complex
cstdarg
cstdbool
cstdint
cstdio
cstdlib
ctgmath
ctime
cwchar
cwctype
functional
memory
random
regex
tuple
utility
我比较熟悉和期待的是bind, function, auto, shared_ptr, mem_fnq几个库了,写了个小例子验证之:
// g++ -std=c++0x -o testC++0x testNewC++.cpp
2
3
#include <tr1/memory>
4
#include <tr1/functional>
5
#include <tr1/tuple>
6
#include <vector>
7
#include <iostream>
8
9
using namespace std;
10
11
void func1(int i, int j, tr1::tuple<int, int, int> k)
12
{
13
cout << "func1:" << i << ", " << j << ", "
14
<< ", tuple param:[" << get<0>(k) << "," << get<1>(k)
15
<< "," << get<2>(k) << "]" << endl;
16
}
17
18
19
void func2(int i, int j)
20
{
21
cout << "func2: " << i << ", " << j << endl;
22
}
23
24
void func3(int k)
25
{
26
cout << "func3: " << k << endl;
27
}
28
29
struct MyFunc1
30
{
31
void memFun1(int i, int j)
32
{
33
cout << "MyFunc1::memFun1 :" << i << ", " << j << endl;
34
}
35
36
void memFun2(int i, int j, int k)
37
{
38
cout << "MyFunc1::memFun2 :" << i << ", " << j << ", " << k << endl;
39
}
40
};
41
42
int main()
43
{
44
45
typedef tr1::function<void (int)> Func;
46
using std::tr1::bind;
47
using std::tr1::mem_fn;
48
using std::tr1::placeholders::_1;
49
using std::tr1::shared_ptr;
50
51
shared_ptr<MyFunc1> instPtr(new MyFunc1);
52
MyFunc1 functor;
53
54
vector<Func> funcs;
55
funcs.push_back(bind(&func1, _1, 2, tr1::make_tuple(3, 4, 5)));
56
funcs.push_back(bind(&func2, 1, _1));
57
funcs.push_back(&func3);
58
funcs.push_back(bind(&MyFunc1::memFun1, &functor, _1, 21));
59
funcs.push_back(bind(mem_fn(&MyFunc1::memFun2), &functor, 1, 2, _1));
60
funcs.push_back(bind(&MyFunc1::memFun1, instPtr, _1, 22));
61
62
for (auto it = funcs.begin(), itEnd = funcs.end();
63
it != itEnd; ++it)
64
{
65
(*it)(0);
66
}
67
68
return 0;
69
}
~译之后Q运行结果如下:
func1:0, 2, , tuple param:[3,4,5]
func2: 1, 0
func3: 0
MyFunc1::memFun1 :0, 21
MyFunc1::memFun2 :1, 2, 0
MyFunc1::memFun1 :0, 22
估计q么奇妙的特性,q入工业应用q得不少旉吧,ȝ的标准化...
]]>