Linux | c&cpp | Email | github | QQ群:425043908 关注本站

itarticle.cc

01字符串流 istringstream 和 ostringstream 的用法

• istringstream,由 istream 派生而来,提供读 string 的功能。

• ostringstream,由 ostream 派生而来,提供写 string 的功能。

• stringstream,由 iostream 派生而来,提供读写 string 的功能。


ostringstream format_message;

format_message << "val1: " << val1 ;

cout << "val1: " << val1 ;

ostringstream 和 cout 用法是一致的;


02STL容器类vector,list,deque的比较

from clipboard

03C/C++中复杂的指针的理解方法

char* const* (*ss[23][200])(void (*)(int h, void (*)(void)));

(1) 最外层: char* const * (*ss[23][200]) ( void (*) ( int h, void (*)(void) ) ); 这个相当于:T * (A) (B); 也就是一个函数指针,所指向的函数的参数是B,返回值是T的指针;

(2) 一个一个来看,先看T,char* const 是 char型的指针常量;

(3) 再看A:(* ss[23][200] ) (B),这个相当于: (* F ) (B),也就是一个函数指针;

(3.1) A的里面 ss[23][200] 是一个二维数组声明,这个数组的类型是什么呢?结合(3)就知道了:这个数组的每个元素就是(3)中分析得到的——函数指针;整理一下就是:ss[23][200]的每个元素都是一个函数指针;

(4) 再看B: ( void (*) ( int h, void(*)(void) ) ) 这个又是一个函数指针,相当于: void (*F) (P); 它指向的函数参数是P,返回值是void;

(4.1) B这个函数指针指向的函数需要2个参数:第一个参数是int型,第二个参数是:void (*)(void),即:第二个参数又是一个函数指针(这个指针很好分析,就不写了);

(5) 结合(3)和(4)就知道 (*ss[23][200]) (B) 这个数组函数指针所指向的函数的参数也是一个函数指针;

(6) 又结合 (2) 知道(5)的函数指针返回值类型。

所以,整理一下,得到:ss是一个23X200的二维数组,每个元素是一个函数指针(a);它 指向的函数的返回值是一个指针,这个返回值指针的类型是char型的指针常量;函数(a)的参数只有一个,是一个函数指针(b);(b)指向的函数返回值 是void型,参数有两个,第一个是 int 型变量,第二个又是一个函数指针(c),(c)的返回值是void,参数也是void。

04透过 Linux 内核看无锁编程

非阻塞型同步 (Non-blocking Synchronization) 简介如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步。同步可分为阻塞型同步(Blocking Synchronization)和非阻塞型同步( Non-blocking Synchronization)。

内核无锁第一层级 — 少锁

内核无锁第二层级 — 原子锁

内核无锁第三层级 — Lock-free

内核无锁第四层级 — 免锁


05c++delete后虚拟内存不降的原因(疑似内存泄漏)

简单来说,文章开头内存不断增长的趋势的根本原因是:glibc在利用操作系统的内存构建进程自身的内存池。由于进程本身处理请求量大,频繁调用new和delete,在一段时间内,进程不断的从操作系统获取内存来满足新增的调用要求,但是从最终结果上来讲,总有一个临界点,使得进程从操作系统新获取的内存和归还给操作系统的内存达成相对平衡。在这个动态平衡建立前,内存会不断增长,直到到达临界点。

06c++ 模板类 声明和定义都放在.h文件的原因

在分离式编译的环境下,编译器编译某一个.cpp文件时并不知道另一个.cpp文件的存在,也不会去查找(当遇到未决符号时它会寄希望于连接器)。这种模式在没有模板的情况下运行良好,但遇到模板时就傻眼了,因为模板仅在需要的时候才会实例化出来,所以,当编译器只看到模板的声明时,它不能实例化该模板,只能创建一个具有外部连接的符号并期待连接器能够将符号的地址决议出来。然而当实现该模板的.cpp文件中没有用到模板的实例时,编译器懒得去实例化,所以,整个工程的.obj中就找不到一行模板实例的二进制代码,于是连接器也黔驴技穷了

07C++容器模板在共享内存中的使用

在共享内存中使用模板容器的关键问题是指针的问题,相对地址是解决这个问题比较好的方法。一个比较通用的方案是将所有的指针改成一个相对地址记录,还有一种思路对于容器的处理方式是将容器的所有数据按最大数量分配好,使用下标处理。

08C++非类型模板参数

1.非类型的类模板参数。

2.非类型的函数模板参数。

3.非类型模板参数的限制。

09泛化之美--C++11可变模版参数的妙用

C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。

10C++模板类中的typename关键字

从属名称(dependent names): 模板(template)内出现的名称, 相依于某个模板(template)参数, 如T t;

嵌套从属名称(nested dependent names):从属名称在class内呈嵌套装, 如T::const_iterator ci;

非从属名称(non-dependent names): 不依赖任何template参数的名称, 如int value;

如果不特定指出typename, 嵌套从属名称, 有可能产生解析(parse)歧义(可能是类的静态成员).

任何时候在模板(template)中指涉一个嵌套从属类型名称, 需要在前一个位置, 添加关键字typename;

11C++ 模板小结

C++中突出的特性之一就是代码重用,而模板在其中发挥了重要的作用,STL也是依托于C++模板而实现的最为广泛和有用的工具库。模板所涉及到的知识比较杂,简单总结如下,以便日后温习。

12C/C++中复杂的指针的理解方法

void (*funcPtr) ();

funcPtr是一个函数指针,它所指向的函数无参无返回值。

*funcPtr一定要用括号括起来,否则“void *funcPtr();”会被编译器看做是一个函数声明,返回值为void *。

我的名片

网名:丰果 | Ranger

职业:游戏开发

现居:上海市

Email:86668082@qq.com




站点信息

  • 建站时间:2016-04-01
  • 文章统计:728条
  • 文章评论:82条
  • QQ群二维码:扫描二维码,互相交流