
C++
MyObject-C
从事于游戏、广告、推荐、金融交易相关后台开发
展开
-
锁总结
条件变量 原理 条件变量将允许你实现这样的目的:在一种情况下令线程继续运行,而相反情况下令线程阻塞。只要每个可能涉及到改变状态的线程正确使用条件变量,Linux 将保证当条件改变的时候由于一个条件变量的状态被阻塞的线程均能够被激活。 GNU/Linux 刚好提供了这个机制,每个条件变量都必须与一个互斥体共同使用,以防止这种竞争状态的发生。这种设计下,线程函数应遵循以下步骤:...转载 2018-07-22 22:23:12 · 192 阅读 · 0 评论 -
线程锁
互斥锁属性 线程和线程的同步对象(互斥量,读写锁,条件变量)都具有属性。在修改属性前都需要对该结构进行初始化。使用后要把该结构回收。我们用pthread_ mutexattr_init函数对pthread_mutexattr结构进行初始化,用pthread_mutexattr_destroy函数对该结构进行回收。 4 名称:: pthread_m转载 2014-12-23 11:24:56 · 415 阅读 · 0 评论 -
批量信号量并发
信号量并发原创 2021-06-03 18:27:27 · 104 阅读 · 0 评论 -
#define只做替换
#define只做替换,好好体会 #include <iostream> #include <map> using namespace std; class A{ public: A() { //cout << "A" << endl; } A(const A& a) { cout << "A(const A& a)" << endl; .原创 2021-04-28 14:13:21 · 171 阅读 · 0 评论 -
stl容器排序
C++编程优与Pascal的原因之一是C++中存在STL(标准模板库)。STL存在很多有用的方法。 C++模板库中的许多方法都需要相关参数有序,例如Sort()。显然,如果你想对一个集合进行排序,你必须要知道集合中的对象,那个在前那个在后。因此,学会如何定义比较方法是非常重要的。 C++模板库的许多容器需要相关类型有序,例如set 和priority_queue。 这篇文章旨在告诉大家如何为转载 2015-05-27 10:33:48 · 723 阅读 · 0 评论 -
const_cast使用
9class B 10 { 11 public: 12 B(int a):val(a) 13 { 14 } 15 16 ~B() 17 { 18 } 19 20 int val; 21 }; 22 23 template 24 T& remove_co原创 2015-02-07 10:38:37 · 386 阅读 · 0 评论 -
STL内存问题
1. 背景 前些天在一个技术分享会上,某大牛说,STL使用了内存池,释放内存的时候,并不释放给OS,而是自己由留着用。 听到这些观点后,我就有些着急了,因为我以前一直是直接使用STL的一些工具类的,比如std::string、std::map、std::vector、std::list等等,从来都没有关注过内存的问题。 带着内存的问题,我花了两三天的时间去阅读STL的代码,并转载 2015-01-30 18:54:08 · 471 阅读 · 0 评论 -
vector内存问题
1.vector的内存增长 vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量转载 2015-01-30 18:58:14 · 758 阅读 · 0 评论 -
map hash_map unordered_map 性能测试
测试条件: gcc version 4.2.1 20070719 [FreeBSD] FreeBSD 7.2-RELEASE #0: Fri May 1 07:18:07 UTC 2009 root@driscoll.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64 Intel(R) Xeon(R) CPU转载 2014-10-31 15:36:30 · 525 阅读 · 0 评论 -
C++ STL中Map的按Key排序和按Value排序
C++ STL中Map的按Key排序和按Value排序 map是用来存放键值对的数据结构,可以很方便快速的根据key查到相应的value。假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择。 我们这样定义,map,其中学生姓名用string类型,作为Key;该学生的成绩用int类型,作为value。这样一转载 2014-10-29 20:38:22 · 350 阅读 · 0 评论 -
C++的static
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 一、面向过程设计中的static 1、静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: [cpp] view转载 2014-10-11 10:39:56 · 304 阅读 · 0 评论 -
static 函数
函数默认声明为extern; 问题一: 1,头文件 static void DelFriend(); 2,cpp文件 实现; 3,main文件包含头文件,调用DelFriend(); 错误: 静态函数“void DelFriend(void)”已声明但未定义 参见“DelFriend”的声明 解决: main文件包含cpp文件,调用DelFriend(); 问题二:原创 2015-02-11 16:29:53 · 495 阅读 · 0 评论 -
dynamic_cast
作为四个内部类型转换操作符之一的dynamic_cast和传统的C风格的强制类型转换有着巨大的差别。除了dynamic_cast以外的转换,其行为的都是在编译期就得以确定的,转换是否成功,并不依赖被转换的对象。而dynamic_cast则不然。在这里,不再讨论其他三种转换和C风格的转换。 首先,dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的sou转载 2015-03-03 11:50:41 · 319 阅读 · 0 评论 -
c++ new 重载的几种形式
p = new P(); 这样的代码的时候, 实际上有两步操作, 首先分配内存, 然后在分配好的内存之上初始化类成员。 第二步是有构造函数完成的, 第一步就是new函数的工作。 全局的new有六种重载形式, void *operator new(std::size_t count) throw(std::bad_a转载 2015-03-03 15:17:31 · 1281 阅读 · 0 评论 -
模板特化与偏特化
模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。 模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分。 先看类模板: [cpp] view plaincopy templatetypename T转载 2015-03-05 18:30:25 · 395 阅读 · 0 评论 -
stl bind2nd
比如我们有下面的类: class ClxECS { public: int DoSomething() { // 这里以输出一句话来代替具体的操作 cout << "Output from method DoSomething!" << endl; return 0; }; }; 和下面的一转载 2015-07-10 17:54:18 · 431 阅读 · 0 评论 -
位域
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 一、位域的定义和位域变量的说明 位域定义与结转载 2017-11-16 14:44:50 · 317 阅读 · 0 评论 -
stringstream使用
使用stringstream对象简化类型转换C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性、类型安全和可扩展性。在本文中,我将展示怎样使用这些库来实现安全和自动的类型转换。为什么要学习如果你已习惯了<stdio.h>风格的转换,也许你首先会问:为什么要花额外的精力来学习基于<sstream>的类型...转载 2018-03-20 16:00:20 · 161 阅读 · 0 评论 -
makefile生成 *.d 依赖文件及 gcc -M -MF -MP 等相关选项说明
1. 为什么要使用后缀名为 .d 的依赖文件? 在 Makefile 中, 我们的依赖关系可能需要包含一系列的头文件。 比如 main.c 源文件内容如下: #include "stdio.h" #include "defs.h" int main(int argc, char *argv[]) { printf("Hello, %s!\n", NAME); retur...转载 2018-10-25 16:06:06 · 7210 阅读 · 0 评论 -
c++ makefile编写
一、gcc命令 从目的上看,gcc命令和makefile的功能是一样,即是把源文件编译后生成可执行文件或.o二进制文件。gcc命令中有许多的额外的参数,本文仅介绍以下几种最简单和常用的方法: 有helloworld.c文件如下: #include <stdio.h> int main() { printf("helloworld!\n"); ...原创 2017-11-04 15:02:34 · 1653 阅读 · 0 评论 -
STL erase操作
STL erase操作 (2011-06-08 10:37:33)▼ STL中的容器都有erase方法,容器的存储分为顺序存储(如vector)与链式存储(如list,map)。 先以map为例: typedef std::map TStrMap; typedef TStrMap::iterator TStrMapIter; TStrMap strmap转载 2014-10-10 18:33:35 · 352 阅读 · 0 评论 -
类模板参数
template class D { public: D(); ~D(); private: }; int _tmain(int argc, _TCHAR* argv[]) { D d1; D d2; }原创 2014-10-09 14:45:21 · 683 阅读 · 0 评论 -
list删除元素
常用的删除容器中元素的方法是如下(方法1): list List; list::iterator iter; for( iter = List.begin(); iter != List.end(); ) { if(1) { iter = List.erase( iter原创 2014-04-03 16:56:40 · 398 阅读 · 0 评论 -
板函数的定义和声明须在同一文件内
模板函数的定义和声明须在同一文件内 按照C++中代码的惯例,类声明在h文件中,类定义在cpp文件中,相应的成员函数声明也在h文件中,定义在cpp文件中。但是如果这样的架构用在模板函数中,在调用模板函数的地方链接器便会报错,error LNK2001: unresolved external symbol。将定义写在与声明相同的文件中问题解决,解释如下: “大部分编译器在编转载 2014-04-18 10:03:04 · 456 阅读 · 0 评论 -
const 用法
修饰函数的定义体: 定义const函数,只需要将const关键字放在函数声明的尾部。任何不会修改类的数据成员的函数都应该声明为const 类型。如果在编写const 成员函数时,不慎修改了数据成员,或者调用了其它非const 成员函数,编译器将报错,这无疑会提高程序的健壮性。 class Stack { public: void Push(int elem);原创 2014-03-22 17:11:24 · 491 阅读 · 0 评论 -
map,set----insert
cliext::pair insert(value_type val); iterator insert(iterator where, value_type val); template void insert(InIter first, InIter last); void insert(System::Collections::Generic::IEn原创 2014-04-17 13:20:48 · 592 阅读 · 0 评论 -
数组和指针
数组和指针: (一)一维数组和指针 int a[2] = {0x12345678 , 90}; int *p; p = a 首先 p 指向 a,因为数组的名字就是指针,而且类型是 int 所以这里简单的匹配了。 那么 *p == a[0] == 0x12345678 *(p+1) = a[1] = 90; 注意指针地址加一这个操作,关键是看指针的类型,现在这里指针既然转载 2014-03-21 11:34:58 · 371 阅读 · 0 评论 -
c++内存模型一
nonstatic data member 被置于每个对象内,static data member被置于每个对象外。static 和 nonstatic function 也被置于每个对象外。 virtual function 的支持: 1)虚函数表 2)虚表指针。 X foobar() { X xx; X *px = new X; xx.foo(原创 2014-03-19 11:24:41 · 414 阅读 · 0 评论 -
c++内存模型二
有四种情况,会导致编译器必须为未声明constructor之classes合成一个default counstructor。 1)包含成员对象 2)base class的默认counstructor 3)为每一个对象初始化其virtual function机制 4)为每一个对象初始化其virtual base class机制 除却这四种情况,default counstructor 实际原创 2014-03-19 17:56:02 · 382 阅读 · 0 评论 -
typeid
#define TYPE_T(T) (typeid(T).hash_code()) //取出类型原创 2014-04-14 18:09:56 · 527 阅读 · 0 评论 -
placement new的使用
new的第三种形态——placement new是用来实现定位构造的,因此可以实现new operator三步操作中的第二步,也就是在取得了一块可以容纳指定类型对象的内存后,在这块内存上构造一个对象,这有点类似于前面代码中的“p->A::A(3);”这句话,但这并不是一个标准的写法,正确的写法是使用placement new: #include void main() {原创 2014-04-04 16:27:49 · 438 阅读 · 0 评论 -
&运算符
int a原创 2014-05-09 10:53:55 · 281 阅读 · 0 评论 -
C++模板特化
模板的特化(template specialization)分为两类:函数模板的特化和类模板的特化。 (1) 函数模板的特化:当函数模板需要对某些类型进行特别处理,称为函数模板的特化。例如: 1 bool IsEqual(T t1, T t2) 2 { 3 return t1 == t2; 4 } 5 6 int main() 7 { 8转载 2014-10-09 14:15:47 · 401 阅读 · 0 评论 -
C++成员总结
c++的两大特色是多态和模板。其中多态是通过继承和虚函数来实现的,其中虚函数是通过每个对象里面的虚表来实现的。如果这个对象的类有虚函数,那么这个类就有一张虚表,存的是每个虚函数的入口地址,而这个类的每个对象,都会有一个4字节的指针,指向这张虚表,这个就是虚指针。 上面一段话很多人都知道,但是如果问普通成员函数,编译器是怎么找到它的入口地址的呢?也就是说,怎么进行调用?为什么A类一个foo函数转载 2014-10-24 11:30:57 · 457 阅读 · 0 评论 -
equal_range
equal_range是C++ STL中的一种二分查找的算法,试图在已排序的[first,last)中寻找value,它返回一对迭代器i和j,其中i是在不破坏次序的前提下,value可插入的第一个位置(亦即lower_bound),j则是在不破坏次序的前提下,value可插入的最后一个位置(亦即upper_bound),因此,[i,j)内的每个元素都等同于value,而且[i,j)是[firs转载 2014-08-07 11:03:55 · 327 阅读 · 0 评论 -
温故知新C++学习四
数组: typename array原创 2014-07-24 18:46:35 · 357 阅读 · 0 评论 -
温故知新C++学习三
C++如何确定常量lei原创 2014-07-23 13:42:00 · 398 阅读 · 0 评论 -
温故知新C++学习二
在C++编译过程中,原创 2014-07-23 09:52:27 · 393 阅读 · 0 评论 -
规范
1.类成员私有,方法访问 客户端向服务器发送请求消息,无论成功与否,回复错误编号。 { 两种方法: 1. 无论客户端请求什么,先回复错误编号,再使用另一消息类型发送请求内容,让客户端解析。 2. 无论客户端请求什么,先回复错误编号,再继续发送请求内容,让客户端解析。 } 两种方法: 1. 客户端服务器之间发消息,为每种消息指定格式,按照指定格式解析原创 2014-04-21 15:57:50 · 425 阅读 · 0 评论 -
温故知新C++学习一
OOP:原创 2014-07-21 14:05:34 · 389 阅读 · 0 评论