代码改变世界

C++代码性能

2013-03-14 10:18 by Freeman in Qt, 373 阅读, 0 推荐, 收藏,
摘要:影响性能的操作:* I/O的开销* 函数调用的开销* 复制对象的开销* 对可能不必要的对象进行创建和销毁* 在频繁调用的函数中进行对象的跟踪(Trace),这种情况尽量使用内联,因为此时主要的开销来自函数的调用和返回* 沉余构造(构造函数中没有使用列表),如 C (const char *s) { name = s; } // 这种情况会首先调用name的默认构造函数,然后s会覆盖默认值。还有一种情况,假如name所属类没有char *的赋值操作符,会产生构造和销毁一个临时变量的指令。提倡:* 应编写短小的,频繁调用的内联函数* 函数参数按引用传递* 使用内联的构造和析构函数(当频繁构造对象时 阅读全文

2013给自己制定两个方向

2013-02-21 09:46 by Freeman in Qt, 177 阅读, 0 推荐, 收藏,
摘要:2013年,新的一年我给自己制定了两个方向,这也让我面临两个选择。 一个是嵌入式方向:之所以选择这个方向是可以让我有机会做自己的产品。嵌入式开发的门槛很高,但只要我能静下心钻研一年半载我就能入门,然后就一直朝着这个方向探索,最终能开发一款完整的产品。 另外一个方向是手机软件开发,这是个新兴市场,这个 阅读全文

[转]中美两国软件开发管理的比较与启示

2013-01-24 12:28 by Freeman in Qt, 258 阅读, 0 推荐, 收藏,
摘要:看了不少关于软件开发管理的书籍,我注意比较了中美两国软件公司在软件开发管理和技术方面的不同之处。 第一,软件工程师年龄和经验的反差。美国许多公司,如NASDAQ上市公司,公司只有5年时间,但是近一半的软件工程师、软件项目经理和软件设计师都不算很年轻,并有着5年以上的软件开发经验(不包括在校期间的经验)。其中部分软件设计师更是年龄在35岁以上(有的甚至已经45岁),有着15年以上的软件开发经验。反观国内的软件工程师,绝大部分是刚从学校毕业不久,而且多半的软件工程师都定位在将来做管理者,这样,经验无法积累,低水平重复的现象就在所难免了。第二,软件开发管理职位设置的差异。在国内,许多软件公司雇佣.. 阅读全文

[原创]如何在Qml和C++类之间进行交互(枚举,成员变量,成员函数)

2013-01-15 10:23 by Freeman in Qt, 1996 阅读, 0 推荐, 收藏,
摘要:在QtQuick项目中,我们可能会用到Qt的各种库(QSettings, QtXml等),这个时候就要我们去解决Qt库和Qml交互的问题,即C++和Qml的交互,特别当我们需要从Qml访问C++类的成员。要想在Qml中访问C++类,要分别在几个文件中做一些前提工作,下面用我在goodoffood项目中的代码作为示例:一、导出C++类的成员变量和函数Settings.h// Settings继承Qt的QSettings类// 用来存储程序运行时所需的数据信息(是否第一次启动isFristBoot,当前的语言currentLanguage等)class Settings: public QSett 阅读全文

[原创]枚举与字符串的转换

2012-10-24 10:05 by Freeman in Qt, 2461 阅读, 0 推荐, 收藏,
摘要:一、前言:在项目开发中,经常要在处理输入输出数据时对枚举类型和字符串进行转换,特别是在读写数据库和报文封装,如果在函数内部处理这种转换则会有大量的if switch,不灵活且不利于代码的维护。本文介绍如何通过一个专用的模版类来处理所有这种转换,基于此方法可以很方便的增加和删除对某种枚举类型的支持。二、解决方案:首先定义一个抽象基类,用字典的方式来提供查询操作。针对每个枚举类型从抽象类派生出一个类并负责构造对应转换所需的字典。三、类设计A.设计思路1.定义一个抽象的模版基类CAbstractEnumStringConverter2.抽象出两个公用的接口,ToString(转换成字符串)与Valu 阅读全文

为抽象基类定义虚析构函数

2012-10-22 10:15 by Freeman in Qt, 561 阅读, 0 推荐, 收藏,
摘要:Class Base{ virtual ~Base() = 0 // 纯虚析构函数 { // 定义体 ; }};结论:1.Base没有其它成员函数可用的时候,通过定义纯虚析构函数来实现抽象类的定义。2.当定义了虚析构函数必须有定义体,因为虚析构函数工作的方式是:最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用。这就是说,即使是抽象类,编译器也要产生对~Base的调用,所以要保证为它提供函数体。如果不这么做,链接器就会检测出来,最后还是得回去把它添上 阅读全文

sqlite3常用指令

2012-09-22 14:29 by Freeman in Qt, 153 阅读, 0 推荐, 收藏,
摘要:查询"SELECT value1,value2 FROM [tablename] WHERE key1 = ?;" // 匹配单个值"SELECT value1,value2 FROM [tablename] WHERE key1 = ? and key2 = ?;" // 匹配多个值保存"SELECTcount(*)FROM [tablename] WHERE key1 = ?;" // 匹配是否存在相同的插入 // 不存在"INSERT into [tablename] (value1,value2) values(?, 阅读全文

[转]在堆上分配内存

2012-07-17 17:33 by Freeman in Qt, 1013 阅读, 0 推荐, 收藏,
摘要:可能许多人对内存分配上的“栈 stack”和“堆 heap”还不是很明白。包括一些科班出身的人也不明白这两个概念。简单的来讲,stack上分配的内存系统自动释放, heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里。stack一般是静态分配内存,heap上一般是动态分配内存。由malloc系统函数分配的内存就是从堆上分配内存。从堆上分配的内存一定要自己释放。用free释放,不然就是术语——“内存泄露”(或是“内存漏洞”)—— Memory Leak。于是,系统的可分配内存会随malloc越来越少,直到系统崩溃。还是来看看“栈内存”和“堆内存”的差别吧。栈内存分配:(典型的函数 阅读全文

模版中 typename 与 class 区别

2012-07-13 14:05 by Freeman in Qt, 311 阅读, 0 推荐, 收藏,
摘要:按 C++ 标准来说,template<typename T> 用于基础数据类型,typename 指类型名,T 可以取 char int double 等。template<class T> 用于类,T 可以取任何类。但是这里有一个问题,结构体应该用 typename 还是 class? 结构体肯定不是基础数据类型,但也不是类。所以实际情况是,template<class T> 的 T 也可以取基础数据类型,tempate<typename T> 的 T 也可以取类。 但有一个特例,就是当 T 是一个类,而这个类又有子类(假设名为 innerC 阅读全文

食物百科1.0.0 for N9

2012-06-19 16:55 by Freeman in Qt, 190 阅读, 0 推荐, 收藏,
摘要:经过了一个多月的攻坚,食物百科终于发布了。6.9 提交QA测试,下面是提交记录:6.19: 修改control文件的编码为UTF-87.5: 修改程序管理的图标与桌面图标保持一致7.10: 在免责声明对话框中,点击空白区域不应该退出程序7.11: 当系统语言为中文时包管理器中显示的名字及描述与桌面显示不一致程序介绍 日常饮食中,我们往往比较关心食物的味道,在享受美味在舌尖律动时,却很少关注食材本身的营养价值以及怎样合理的搭配它们,殊不知这对我们的健康尤为重要。本应用程序类似一个食材字典,记录了日常饮食中常见的食材,以及和它相克,相宜的食材,并且收录了一系列食材的常识。通过本程序您可以迅... 阅读全文