Cpp记录10.4k

更新于 2015/7/9 10:03:12

名称空间

  • 匿名的名称空间只在本文件中可见。

    //file1.cpp
    namespace
    {
        int challenge = 0;
        void test()
        {
            ...
    }
    
  • 名称空间的创建

一般来说,声明实现是要分离的,而对于一个名称空间来说,不能再某个名称空间中声明了,却在另一个名称空间里定义,所以我们一般在头文件中声明它,并在实现文件中定义它们

// file1.h
namespace mix_define{

        void interF(int args_1);
        double goRound(int args_1);
        ...
}


//file1.cpp
namespace mix_define{

        void interF(int args_1)
        {
            //Something happen...
        }

        double goRound(int args_1)
        {
            //Something happen...
        }
}
  • 使用名称空间的时候,最好避免全部倒入,容易造成名称污染。

    Read More

Qt记录

开启C++11支持

  1. .pro文件中增加:

    CONFIG += c++11
    

    或者

    QMAKE_CXXFLAGS += -std=c++11
    

    两种添加形式都是可行的,建议每个工程单独配置,而不要一劳永逸。

信号与槽

Read More

Opencv3.0.0配置

配置Opencv3.0.0

前天,Opencv3.0.0的正式版本发布,不再有奇怪的缺少文件之类的错误,正好最近需要使用它来完成一些神经网络上的辅助,也就尝试了配置,下面记录配置的过程。

准备

  1. Visual Studio 2013
  2. Code::Blocks 13.12
  3. Opencv-3.0.0
  4. CMake3.3.0-rc1-win32-x86

声明

  • 按照自己的喜好来选择第一部分或者第二部分

  • 第一部分 : Visual Studio 2013 配置 Opencv3.0.0

  1. Windows8.1 + 64位
  2. Opencv-3.0.0 的放置路径为 C:\opencv
  3. Visual Studio 工程存放位置为 C:\VSProject 目录下
    • 在此处建议,无论什么路径,都是用英文,并且不要使用空格,如果是操作系统自带的文件路径请看准是否有空格,否则配置这opencv会让你疯狂。
  4. 对于 Visual Studio 2013 来说,我们使用的官方编译好的文件夹所在位置是 vc12,我也不懂为什么,总之就是这样。
  • 第二部分 : Code::Blocks 13.12 配置 Opencv3.0.0
  1. Windows8.1 + 64位
  2. Opencv-3.0.0待编译的源代码路径为 C:\opencv3(由Github上下载)
  3. Opencv编译完成的所有文件放于 C:\opencv\mybuild,即待会使用CMake输出的文件夹。
  4. include 和第一部分相同,不同的只是 libbin 目录,我选择把bin目录全部拷贝到Debug文件夹里。

1 配置 Visual Studio 2013

Read More

我为什么学C(5)---效率(下)

更新于 2015/6/3 19:19:13

0x08-C语言效率(下)

注:存储器山就是对于不同步长不同大小文件的读取速率的三维坐标图,形似一座山,z轴为速率,x轴为步长,y轴为文件大小(字节),某些主流的测评软件便是这个原理(将存储器山的图像进行一下简单的变换,就能得到哪些软件呈现的效果图像)。

上文提到过,任何一点小改动,都有可能让程序的性能发生很大的变动,这是为什么?

当时我们并未深究,由于我们惯性的认为计算机的运作方式和人类的运作方式一致,也在过往的经验中认为计算机一定是在任何方面超越人类的存在,但是实际上,计算机除了在重复计算方面比人类的速度要快速以外,其他方面远远落后于人类的大脑,即便是我们最稀疏平常的视觉识别(看东西识别物体),在计算机看来都是一门极其高深的领域,所以我们现在的时代的计算机还处于起步状态,在这种时代里,程序员的作用是无可替代的,同样程序员的一举一动关乎计算机的命运

可能在很多的方面,都已经接触了一台计算机的主要组成构造,和程序员最息息相关的便是CPU,主存以及硬盘了,可能到现在为止很多程序员仍然认为编程序和这些存储器有什么关系?然而一个程序员,特别是编写C语言程序的程序员,最大的影响因素便来自于此,在计算机的存储器结构中,分为四种层次:
CPU寄存器 高速缓存器 主存 硬盘

但是有没有想过,为什么计算机存储器系统要分成这四层结构呢?我们知道,上述四种存储器的读写速度依次降低,我们为什么不选择一种速度中庸的,价格也中庸的材料,制造所有层次的存储器呢?

  • 有人给出的解释是,一个编写良好的程序总是倾向于访问层次更高的存储器,而对于现在的技术,价格高昂而无法大量制造的高速存储器来说,我们可以选择按层次分配构造,让我们以最低的成本的存储器达到使用最高的速度存储器的效果。
  • 就像是在自己的计算机上,当我们打开一个很笨重的应用程序后,会发现,下一次再打开的时候可能会更快,就像以前历史遗留的一个问题 Visual Studio 2008Windows XP 上,第一次打开总是十分卡顿,但是当关闭程序之后第二次打开却是很流畅。在参考书中,提到过两个评价程序速度的关键点:时间局部性和空间局部性
    • 时间局部性:在访问过某块存储器之后的不久的将来,很可能会再次访问它
    • 空间局部性:在访问过某块存储器之后的不就的将来,很可能访问其邻近的存储器位置。
    • 良好的局部性改进一般能很好的提升程序的性能。
  • 所谓局部性就是当我们使用过某些资源后,这些资源总是以一种形式存储在更高级更方便的存储器当中,让最近一次的存取请求能够更加有效率的进行。

    Read More

我为什么学C(4)---效率(上)

0x07-C语言效率(上)

更新于 2015-05-23

大概所有学习C语言的初学者,都被前辈说过,C语言是世界上接近最速的编程语言,当然这并不是吹牛,也并不是贬低其他语言,诚然非C语言能写出高速度的代码,但是C语言更容易写出高速的程序(高速不代表高效),然而再好的工具,在外行人手中也只能是黯淡没落。

对于现代编译器,现代CPU而言,我们要尽量迎合CPU的设计(比如架构和处理指令的方式等),虽然编译器是为程序员服务,并且在尽它最大的能力来优化程序员写出的代码,但是毕竟它还没有脱离电子的范畴,如果我们的代码不能让编译器理解,编译器无法帮我们优化代码,那么我们就无法写出一个高速的程序。

对于此,我们可以暂且忽略CPU的设计,因为我们在层面上只能考虑如何迎合编译器的优化规则,而CPU则是语言以及编译器的事情了。

提高程序的速度,就C语言而言可以有这几种方法:

  • 首先还是要设计合理的大纲,正所谓一个程序最大的性能提升就是它第一次运行的时候
  • 要避免连续的函数调用。
  • 消除不必要的存储器使用(并非推荐使用register)
  • 使用循环展开技巧,一般编译器的优化选项能自动帮你修改代码成循环展开
  • 对于一个操作的核心耗时部分,通过重新组合技术来提高速度
  • 多采用几种风格的写法,而不是直观的认为,因为计算机的想法和你是不一样的

    Read More

可视化Qt信号与槽

Qt5 中的信号与槽

对于已经有了IDE的Qt而言,我们拥有更多的建立信号-槽方法的选择,但是作为一名自然人类,我们最喜欢的还是眼见为实,既然Qt为我们设计了 Qt Creator,那么我们就应该充分利用它,然而国内的教程大都停留在非可视化操作下,这里记录在 Qt Creator 下我们该如何设计一个信号-槽机制

准备工作

打开Qt Creator,创建Qt Gui项目,我使用的是Qt5,但是同样也适用于Qt4,两者的在本次中的区别就在于建立连接(QObject::connect)的时候,Qt5更加灵活。

项目是MainWindow类,建立完成之后, Qt Creator 自动生成一系列文件

  1. 打开mainwindow.h头文件,进行添加测试函数 void test();
  2. 首先包含以下测试使用的头文件<QDebug> <QMessageBox>
    该函数原型需要首先加在private:下,作为私有成员函数。

  3. 其次打开mainwindow.cpp文件,进行测试函数的定义:

    void MainWindow::test()
    {
        qDebug() << "Test Successful!";
        QMessageBox::information(this, tr("Tip"), tr("Test"));
    }
    
  4. 上方的系列操作,2这个功能在Qt5下成功,Qt4需要在标签public slots:下放置该函数声明。3这个操作中定义了test()的函数体,其中qDebug()是在终端调试的时候使用的一个函数,我们使用它来在 应用程序输出 窗口显示是否成功。QMessageBox::information(...)则是用来显示一个窗口,也用来显示是否成功。

方法1

  1. 双击.ui文件,进入Qt Designer,至于不懂这个的也无所谓,只是个叫法而已,只需要知道如何在这个界面操作即可。

    Read More