c++
文章平均质量分 81
huangjh2018
这个作者很懒,什么都没留下…
展开
-
__declspec(dllexport)和__declspec(dllimport)
在Windows中,动态链接库(DLL)是作为函数和资源的共享库的一种可执行文件。动态链接是操作系统功能。它可使执行文件调用函数或使用存储在单独文件中的资源。可从使用这些函数和资源的可执行文件中对其分别进行部署。DLL不是独立的可执行文件。DLL在调用它们的应用程序的上下文中运行。操作系统将DLL加载到应用程序的内存空间中。此操作要么在加载应用程序时(隐式链接)完成,要么在运行时按需(显示链接)完成。DLL还可以在可执行文件之间轻松共享函数和资源。多个应用程序可同时访问内存中单个DLL副本的内容。原创 2023-02-05 15:42:27 · 2241 阅读 · 0 评论 -
泛型编程——模板及模板的特例化
1. 简介 面向对象编程(OOP)和泛型编程都能处理在编写程序时不知道类型的情况。不同之处在于:OOP能处理类型在程序运行之前都未知的情况;而泛型编程中,在编译时就能获知类型了。 模板是C++中泛型编程的基础。一个模板就是一个创建类或函数的蓝图或者说公式。当使用一个vector这样的泛型类型,或者find这样的泛型函数。这种转换发生在编译时。 编写单一模板,使之对任何可能的模板实原创 2018-01-25 21:11:30 · 1027 阅读 · 0 评论 -
C++显示类型转换(static_cast,const_cast,interpret_cast,dynamic_cast)
在我们进行c++编程时候,有时候我们希望显示地将对象强制转换成另外一种类型。 c++为我们提供了4中强制类型转换:static_cast、dynamic_cast、const_cast和reinterpret_cast。 下面我们就来谈谈这4中强制类型转换的用法。原创 2017-03-29 22:00:02 · 1228 阅读 · 0 评论 -
__attribute__((format(printf, a, b)))
最近,在看libevent源码,第一次看到__attribute__((format(printf, a, b)))这种写法。因此,在这里记录下用法。功能:__attribute__ format属性可以给被声明的函数加上类似printf或者scanf的特征,它可以使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。format属性告诉编译器,按照printf, scanf等标准C函数参数格式规则对该函数的参数进行检查。这在我们自己封装调试信息的接口时非常的有用。format的语法格式为:原创 2017-08-08 22:11:04 · 12706 阅读 · 3 评论 -
boost::less_than_comparable
在实际的编程过程中,我们有时候需要对自定义的类重载操作运算符,以便可以进行类之间的比较等操作。此时,我们可能就需要重载所需的运算符。 但是重载一个类型的操作符时,保证所有操作符都有重载是一件乏味并容易出错的工作,并且确存在这样的事实:其中一些重载的运算符函数可以通过某个或几个的重载运算符函数得出。举个例子来说:当我们需要重载>、<、>=和<=操作符的时候。如果我们重载了<运算符,那么其实我们通过<就能够确认其他等式。幸运的是,在Boost.Operators中就提供了这种便捷的方法。通过使用Boost原创 2017-07-04 21:11:54 · 1295 阅读 · 0 评论 -
boost::static_pointer_cast、boost::dynamic_pointer_cast和boost::const_pointer_cast
当我们用“裸”指针进行类层次上的上下行转换时,可以使用dynamic_cast。当然我们也可以使用static_cast,只是dynamic_cast在进行下行转换的时候(即基类到派生类)具有类型检查功能,而static_cast没有。因此存在安全问题。当我们使用智能指针时,如果需要进行类层次上的上下行转换时,可以使用boost::static_pointer_cast和boost::dynamic_pointer_cast。(C++11中也支持智能指针和转换,只是命名空间改成std即可)。原创 2017-07-03 21:07:30 · 8308 阅读 · 0 评论 -
程序随笔——timestamp(时间戳)
在实际编程中,经常需要用到时间戳。因此,对Linux上的一些时间API进行封装,实现了个CTimestamp类,该类的内部用一个int64_t类型来存储时间,时间精度为微秒。类重载了比较,提供了转换为字符串的方法。原创 2017-07-12 22:16:06 · 4473 阅读 · 0 评论 -
程序随笔——C++实现的一个线程池
1.线程池简介线程池是一种多线程处理形式,处理过程中我们将相应的任务提交给线程池,线程池会分配对应的工作线程执行任务或存放在任务队列中,等待执行。我们知道在面向对象编程中,创建和销毁对象是需要消耗一定时间的,因为创建一个对象要获取内存资源或者其它更多资源。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个原创 2017-06-10 17:02:13 · 605 阅读 · 0 评论 -
一个参考Java开源框架Netty-ChannelBuffer类的简单实现
ChannelBuffer是参考Java开源框架Netty的ChannelBuffer,整个ChannelBuffer的模型如下:原创 2017-07-01 13:01:58 · 663 阅读 · 0 评论 -
C++学习笔记之——vector的size和capacity、resize和reserve的区别
在使用STL中的vector时,对于size和capacity、resize和reserve的使用很是模糊。于是这篇博文就诞生了,主要是加深自己的理解和方便日后查阅。在vector中size()和capacity()属性分别对应着resize(size_type)和reserve(size_type)这两个方法。为此,我们先来看看size()和capacity()属性的区别:原创 2017-06-29 21:20:37 · 9025 阅读 · 1 评论 -
用C++简单实现的——BlockingQueue类(java)
最近,简单整理完Linux线程方面的知识点,突发奇想的想写个线程池来玩玩。经过多方的考虑,决定仿java的线程池来写。由于没有学过java,最后的结果可能差距很大,好像扯远了回到正题来。Java线程池中使用到了BlockingQueue类那就先来试着用C++来实现它吧!最终只实现了BlockingQueue中的ArrayBlockingQueue(基于数组的阻塞队列实现)和LinkedBlockingQueue(基于链表的阻塞队列)也只实现了BlockingQueue中4个核心的方法。好像对线程池来说够用原创 2017-05-12 15:23:50 · 841 阅读 · 0 评论 -
Linux多线程编程(一)——线程创建
1.1线程的概念线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另原创 2017-04-19 21:58:47 · 416 阅读 · 0 评论 -
boost::function用法详解(一)
最近在写代码过程中需要使用boost::function,在此之前并没有接触过boost::function,这里主要记录下对boost::function的学习和理解。boost::function是一个函数对象的“容器”,概念上像是C/C++中函数指针类型的泛化,是一种“智能函数指针”。它以对象的形式封装了原始的函数指针或函数对象,能够容纳任意符合函数签名的可调用对象。因此,它可以被用于回原创 2017-05-03 16:19:23 · 10343 阅读 · 1 评论 -
C++学习笔记之——友元
为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。不过,类的访问权限确实在某些应用场合显得有些呆板,从而容忍了友元这一特别语法现象。友元的分类:类可以把一个普通函数定义成友元,也可以把其他类定义成友元,还可以把类的成员函数定义成友元。原创 2017-04-17 22:17:39 · 348 阅读 · 0 评论 -
C++学习笔记之——局部对象和临时对象的构造和析构时机
在写这篇文章之前,一直没有注意过C++中临时对象何时调用析构的。直到最近看代码的过程中遇到这种情况。由于不了解临时对象何时调用析构函数,所以很不了解代码的实现。甚至还用局部对象的析构时机去看待。先讲讲自己遇到的情况:博主是在看mudo日志库时候遇到的,在mudo日志库中类Logger的析构函数回去获取输入的Buffer,并写入到文件或标准输出。实现在需要打印日志的地方会创建临时对象Logger原创 2017-04-19 17:22:21 · 1700 阅读 · 0 评论 -
高效的将整型类型转换为字符串的方法
最近在项目中需要用到将数字转换为字符串,这里主要记录在使用过程中的一些思考。说到如何将数字转换为字符串,我们可能先想到的是C函数库提供的snprintf等系列的函数或是C++库提供的功能更为强大的stringstream对象来进行转换。没错C函数库提供的snprintf等系列函数非常的好用和方便。例如:我们想要将一个int型的数值转换为对应的字符串。#include #i原创 2017-04-29 13:53:38 · 4495 阅读 · 0 评论 -
C++程序设计机制——Pimpl机制
PImpl(private implementation) 其主要作用是解开类的使用接口和实现的耦合。原创 2017-04-14 15:44:17 · 1384 阅读 · 0 评论 -
C++学习笔记之——如何写一个异常处理
异常是指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。典型的异常包括失去数据库连接以及遇到意外输入等。当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理。此时,检测出问题的部分应该发出某种信号以表明程序遇到了故障,无法继续下去了,而且信号的发出方无需知道故障将在何处得到解决。一旦发出异常信号,检测出问题的部分也就完成了任务。异常处理机制为程序中异常检测和异常处理这两部原创 2017-04-10 15:50:08 · 1038 阅读 · 0 评论