Jump to Navigation

C++

C/C++编程

在桌面应用程序中使用嵌入式关系数据

桌面应用程序,与网络应该程序一样,也需要记录用户的当前使用状态,

在用户下次使用时,可以使用这些状态数据还原到用户上次的状态。

对于像一些日程表工具,桌面笔记,联系人卡片,都需要记录关系型数据。

在数据量小的时候,随便使用的一种格式的数据文件,甚至文本文件都可以,

但如果用户的数据量大了,还是使用正式的数据库更有伸缩性,扩展性。

但是正式的关系数据库,即使最小最快的sqlite,在真正使用的时候,都会有一些额外的开销,

表现在程序响应慢等问题,却是为了扩展性,损失性能的一鲜活的应用场景。

虽然说,对于特定的应用,可以实现特定的针对此应用的数据库也许多效率更高,

很多时候必要性不那么大,一般也就不是最优选择。

自己做过几个小应用使用嵌入式sqlite数据库,但几次都没有找到一种好的维护方法,

导致在更新到读写数据库/创建新数据库的时候,响应慢,不浅显流畅,所以不需要仔细做些研究,

在使用方式,数据库优化方面找到方法。

Taxonomy upgrade extras:

新C++0x标准试用

最近在为工作做一个试验型项目,使用C++开发,属于逻辑流控制型,基本没有计算,大部分模块不要求效率,

借前不久的C++2011标准,gcc-4.6.0新版本发布,开发1w多行代码。

这个项目的设计在自己的服务器上运行,自行安装维护,不需要考虑过多的系统兼容性,

大量使用方面的新功能没有问题,另一个关键问题还在于稳定,因为这是一个理想状态下需要daemon运行的程序。

新的C++2011标准提供了许多很好的功能,

简化代码,有auto自动类型推导,多用于泛型代码,不需要在使用一长串的模板参数

还可使用代码的统一初始化功能,即使复杂的类型,也可在声明时方便给初始值。

灵活代码,有lamba表达式,用于一些常用算法。

省事代码,有智能指针,指针不再裸奔,不过由于使用的一些C库比较多,有些地方没能用。

还一个在特殊场合提高代码效率的“右值引用”,我喜欢把它称作“乾坤大挪移”。

另一个在多线程中常用到的原子类型及相应原子操作,在<atomic>中。

其他更多的新功能看gcc官方吧。

在试运行过程也遇到问题,对系统要求比较高,但运维人员给安装的服务器系统都比较老,

Taxonomy upgrade extras:

使用C++0x与boost编写的异步信号回调计时器类

这个类的接口与QTimer类似,能对现有代码改动极小的情况下取代QTimer

这个类使用linux上的timer_*系统调用实现,只能用于linux平台,但使用boost:signals2实现了类似Qt的信号回调机制。

编写这个类本意是学习一下boost的信号机制,没想到测试效果非常好,达到完成替代QTimer类的功能,在此列出,

Category:

C++2011添加的关键字

关键字:
constexpr
auto
decltype
static_assert
char16_t
char32_t
wchar_t
nullptr
final
override

符号:
->
[]
>>
&& "rvalue reference"
[[ 和 ]]

Category:

C++0x中的表达式类型自动推导

最近C++最新标准C++2011正式发布了,几乎同时,作为*nix平台标准编译器的GCC 4.6版本也正式发布。
对于想尝鲜的已经可以使用了。
今天遇到一个比较复杂的类型,与模板相关的,写了几次,都说变量的定义不对,想起来C++中有类型推导,翻了一下资料,找到了typeof(exp)这个东西,用起来方便多了。
但是正测试 -std=c++0x的时候又出了问题,再一查,原来有新的方式实现,
typedef decltype(exp) TmpType;
TmpType a;
...
由于要在不同环境下编译,新的方式在老的编译器环境不能用,老的方式在新的环境下不能,只好找了C的#if指令处理,

#if ((__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) && __GXX_EXPERIMENTAL_CXX0X__)
// typedef decltype(exp) 方式
#else
// typeof(exp) 方式。
#endif

Category:

asterisk中自定义fd_set扩展select能处理的文件描述符个数的研究

asterisk中自定义fd_set与FD_ZERO,FD_SET几个量扩展select能处理的文件描述符个数的研究

在asterisk中,仍旧使用select处理socket文件描述符的读写事件驱动,虽然有点老套,但这种方式的移植性更好,现在几乎所有的平台都支持这个函数。如果使用一些特定平台的功能,像linux的epoll或者BSD的kqueue,还有solaris的什么 方式,都需要做一个核心兼容这几种不同操作系统上的方式。

由于进程可使用的文件描述符可使用ulimit -n 32768来设置,而系统自带的FD_SETSIZE却是固定的值,在/usr/include/bits/typesizes.h,目前我在使用的linux服务器系统上,这个值都定义为1024。对于像asterisk这样的服务,当然这个值太小了,不足以完全发挥asterisk和服务器硬件的功能。

现在我们研究下它如何,在include/asterisk/select.h文件开头,有这么一个定义,

typedef struct {
TYPEOF_FD_SET_FDS_BITS fds_bits[4096 / SIZEOF_FD_SET_FDS_BITS]; /* 32768 bits */
} ast_fdset;

ISO C++委员会批准C++0x最终草案

IS0 C++委员会正式批准了C++编程语言国际标准最终草案(FDIS)。标准本身已经完成,接下来将是根据委员会会议修改意见更新工作草案,预计将用三周时间完成FDIS草案,然后交给日内瓦的ITTF,最新的C++标准将在夏天发布,先前被临时命名为C++0x的新标准将被称为C++ 2011。从2003年发布的C++03到2011年的C++ 2011,新标准的制定历经了8年时间。GCC和Visual C++编译器都已加入了C++2011/C++0x的支持。 C++0x FAQ(由C++作者Bjarne Stroustrup维护)

C++2011标准正式出炉了.

Category:

在asterisk中添加skype的SILK语音编码的进展

SILK语音编码/解码器本用于skype的语音聊天传输格式,在2009年底的时候开放源码,这是一种语音质量相当不错的语音编码,很多VOIP还始应用SILK。
这在方面freeswitch反应能快速,在2010年中的时候就开始尝加入对silk的支持,到现在已经比较成熟,完全能用于生产环境了。
而asterisk对此则稍微迟了一点,在2010年底,开始了asterisk-1.10版本的开发后才讨论把silk引入到asterisk中,目前在官方的svn主干中有silk的相关代码。经测试也可以使用,但这个开发版本的asterisk不能用于生产环境。
现在如果要在asterisk上使用silk,必须把对 silk的支持backport到asterisk-1.8版本,这个工作目前进展不错,已经加入了silk 8kHz的支持。
由于aterisk-1.8的语音编码架构的限制,作为一种能支持不同采样率的silk编码,它只能一次支持一种采样率,如果需要支持silk所有4种采样率,相当于对asterisk-1.8添加4种语音编码。
分别为:silk8,silk12,silk16,silk24

Category:

firebreath: 跨平台跨浏览器插件开始框架

使用这个框架,可以方便的编写不同平台,不同浏览器的插件,支持win,linux,mac,支持IE(activex), firefox(NPAPI), opera, safari, google chrome浏览器等。

主页,http://www.firebreath.org/

不错的平台框架。
不过,现在网页插件这种方式,有点不太受欢迎。

Category:

解决openssh与ssh2之间文件传输

ssh2一个商业的ssh服务协议实现,其实现的scp模块与GPL的openssh的scp不兼容,在客户端的用openssh的scp向服务端为ssh2的服务器传输文件时失败,原因也在于此。
但如果scp使用sftp传输,则无论服务端是openssh还是ssh2的,都不会有问题,这引出了openssh中的scp使用sftp协议传输的补丁要求。

根据5.4版本的scp over sftp,移植到了最新的openssh 5.7版本,初步测试没有问题,

5.4的补丁,http://www.phys98.homeip.net/~ide/aboutopenssh-e.html

5.7的补丁,

Taxonomy upgrade extras:

页面

订阅 RSS - C++


Main menu 2

by Dr. Radut