![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 85
继续微笑lsj
眼界决定未来
展开
-
HelloWorld CMake CMake中构建静态库与动态库及其使用
继续完善Hello World,建立它的共享库, 包括静态库和动态库。 本节的任务:1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc向终端输出Hello World字符串。2,安装头文件与共享库。3, 编写一个程序使用创建的共享库(静态库和动态库)。 cd /home/ccj/CMakeDe转载 2017-04-23 13:48:39 · 2003 阅读 · 0 评论 -
#if,#ifef与if defined的区别
#if的使用#if 的后面接的是表达式 (求表达式的值 如果值为真则执行code 部分 否则跳过) code ...#endif#if 的表达式是在编译是求值的 #ifdef的使用#ifdef GREAT 只要GREAT被defined 定义过不管其值是1 还是0 都执行 code部分,code转载 2014-10-11 14:28:21 · 4381 阅读 · 0 评论 -
__must_check含义及出处
include/linux/compiler-gcc4.h #define __must_check __attribute__((warn_unused_result))__must_check函数是指调用函数一定要处理该函数的返回值,否则编译器会给出警告转载 2014-11-07 11:52:31 · 1627 阅读 · 0 评论 -
GCC __attribute__((constructor)|(destructor))
在阅读TGTD的代码时发现了一个非常诡异的问题,声明了一个空的全局数组,在使用的时候却发现数组非空,在main()入口时数组已经非空.数组时在什么地方被赋值了呢?最后发现__attribute__这个东东在起作用,类似于全局变量类的构造函数在main()前被调用.__attribute__((constructor)) __attribute__((destructor))转载 2014-11-07 11:35:50 · 838 阅读 · 0 评论 -
TCMalloc小记
一. 原理tcmalloc就是一个内存分配器,管理堆内存,主要影响malloc和free,用于降低频繁分配、释放内存造成的性能损耗,并且有效地控制内存碎片。glibc中的内存分配器是ptmalloc2,tcmalloc号称要比它快。一次malloc和free操作,ptmalloc需要300ns,而tcmalloc只要50ns。同时tcmalloc也优化了小对象的存储,需要更少的空间。tcm转载 2014-08-14 15:13:02 · 911 阅读 · 0 评论 -
两个"##"到底啥意思啊
cpLog_impl_ (priority__, __FILE__, __LINE__, fmt__ , ##args__);这两个##是做什么的? ##这里起的是字符串链接作用。放在这里是它的一种特殊用法。表示当args__为空时,去掉前面的逗号。 ##不是gcc才有,在一般情况下用于作为宏里的参数和一个字串的连接,在gcc里,##args用于做为不定参数,在C99支转载 2014-06-15 22:40:13 · 2405 阅读 · 2 评论 -
C++中的string
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。 首先,为了在我们的程序中使用string类型转载 2014-05-18 13:23:30 · 894 阅读 · 0 评论 -
C++一些注意点之函数参数为指针
(1)平时比较常用的swap函数代码 #include using namespace std;void swap(int *a,int * b){int c = *a;*a = *b;*b = c;}int main(void){int d1 = 2;int d2 = 3;swap(&d1,&d2);cout<<d1<<" "<<d2<<endl;sy原创 2013-04-06 10:41:56 · 1571 阅读 · 0 评论 -
C++一些注意点之new和malloc
整理了一下网上关于这个问题的见解。 malloc/free和new/delete它们都可用于申请动态内存和释放内存,但是它们却有区别: (1)malloc与free是C++/C语言的内存分配标准库函数,属于stdlib库;new/delete是C++的操作运算符; (2)new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而mallo原创 2013-04-29 16:00:17 · 1746 阅读 · 0 评论 -
C++的三大特性
OOP具有三大特性:封装性、继承性和多态性。1.封装性(Encapsulation) 所谓封装,就是将某些东西包装和隐藏起来,让外界无法直接使用,只能通过某些特定的方式才能访问。OO将万物都视为“对象”(Object),任何对象都具有特性和行为。我们将其特性称为“成员变量” (MemberVarible),将其行为称之为“成员函数"(Member Function),被封装的特转载 2013-09-27 20:26:33 · 3689 阅读 · 0 评论 -
面向对象编程的六大原则
一、单一职责原则:全称:“Single-Responsibility Principle”说明:就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因。所谓职责,我们可以理解他为功能,就是设计的这个类功能应该只有一个,而不是两个或更多。也可以理解为引用变化的原因,当你发现有两个变化会要求我们修改这个类,那么你就要考虑撤分这个类了。因为职责是变化的一个轴线,当需求变化时,该变化转载 2013-09-04 22:49:50 · 1122 阅读 · 0 评论 -
内存对界与pragma pack指令
原文:http://www.th7.cn/Program/cp/201209/92293.shtml http://blog.csdn.net/jamesf1982/article/details/43757191、内存对界原理 在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,转载 2013-04-28 23:16:49 · 1563 阅读 · 0 评论 -
C++一些注意点之类和对象
1.在说明一个类时,没有给出类体而给出类名时,属于类的引用性说明。引用性说明的类不能用来建立对象,只能用来说明函数的形参、指针和引用。例如:class CC;CC c1;//引用性说明不能用来建立对象class X{ CC c3,c4;//错误的 CC* PC;//正确的,建立指针式可以的....};2.定义一个类时,在类体中又包原创 2013-06-07 12:42:35 · 1740 阅读 · 0 评论 -
C++中正确使用PRId64
nt64_t用来表示64位整数,在32位系统中是long long int,在64位系统中是long int,所以打印int64_t的格式化方法是:[cpp] view plaincopyprintf("%ld", value); // 64bit OS printf("%lld", value); // 32bit OS 当转载 2014-10-13 11:53:28 · 1084 阅读 · 0 评论 -
namespace的用法
// Macros for namespaces.// _GLIBCXX_BEGIN_NAMESPACE// _GLIBCXX_END_NAMESPACE// _GLIBCXX_BEGIN_NESTED_NAMESPACE// _GLIBCXX_END_NESTED_NAMESPACE#if _GLIBCXX_NAMESPACE_ASSOCIATION_VERSION# define转载 2014-11-07 11:46:17 · 2125 阅读 · 0 评论 -
乐观锁和悲观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人转载 2016-09-21 13:12:11 · 353 阅读 · 0 评论 -
c++ 11 lamda表达式
class CTest{public: CTest() : m_nData(20) { NULL; } void TestLambda() { vector vctTemp; vctTemp.push_back(1); vctTemp.push_back(2); // 无函数对象参数,输出:1 2 { for_each(vctTem转载 2016-03-01 10:35:10 · 774 阅读 · 0 评论 -
C++中的RTTI机制详解
RTTI是”Runtime Type Information”的缩写,意思是运行时类型信息,它提供了运行时确定对象类型的方法。RTTI并不是什么新的东西,很早就有了这个技术,但是,在实际应用中使用的比较少而已。而我这里就是对RTTI进行总结,今天我没有用到,并不代表这个东西没用。学无止境,先从typeid函数开始讲起。typeid函数typeid的主要作用就是让用户知道当前的变量是转载 2016-03-07 11:28:47 · 552 阅读 · 0 评论 -
宏的高级使用
先说一下本文中会提到的内容:##,__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__等宏变量:先举一个例子,会用到上面这些宏:[cpp] view plaincopy#define myprintf(...) printk("[lch]:File:%s, Line:%d, Function:%s,"转载 2015-11-23 14:41:32 · 480 阅读 · 0 评论 -
Linux中的likely()和unlikely()
likely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢?首先明确: if (likely(value))等价于if (value) if (unlikely(value))等价于if (value)也就是说likely()和unlikely()从阅读和理解的角度是一样的。这两个宏在内核中定义如下:#de转载 2015-09-26 23:40:21 · 816 阅读 · 0 评论 -
makefile 中 $@ $^ %< 使用
这篇文章介绍在LINUX下进行C语言编程所需要的基础知识。在这篇文章当中,我们将会学到以下内容:源程序编译Makefile的编写程序库的链接程序的调试头文件和系统求助1.源程序的编译在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器。 下面我们以一个实例来说明如何使用gcc编译器。假设我们有下面一个非转载 2015-09-01 10:05:51 · 524 阅读 · 0 评论 -
__thread关键字
__thread是GCC内置的线程局部存储设施,存取效率可以和全局变量相比。__thread变量每一个线程有一份独立实体,各个线程的值互不干扰。可以用来修饰那些带有全局性且值可能变,但是又不值得用全局变量保护的变量。 __thread使用规则:只能修饰POD类型(类似整型指针的标量,不带自定义的构造、拷贝、赋值、析构的类型,二进制内容可以任意复制memset,memcpy,且内转载 2015-08-12 16:00:26 · 707 阅读 · 0 评论 -
RDTSC命令详解
RDTSC - 读取时间标签计数器操作码指令说明0F 31RDTSC将时间标签计数器读入 EDX:EAX说明将处理器的时间标签计数器的当前值加载到 EDX:EAX 寄存器。时间标签计数器包含在 64 位 MSR 中。MSR 的高 32 位加载到 EDX 寄存器,低转载 2015-07-18 09:03:48 · 1365 阅读 · 0 评论 -
如何利用rdtsc计算纳秒级的时间
从奔腾系列开始,Intel X86 处理器中增加了一个64位的时间戳寄存器(TSC),每个经过一个时钟周期,该寄存器加1;机器重启时,该寄存器将清空。 现在的处理器其主频都在1G以上,也就是说其时钟周期是纳秒级的(1秒/1000000000=1纳秒)。 那该寄存器会不会溢出呢?我们可以计算一下,假设机器的主频是3GMHz, 也就是说1秒钟包含3,000,000,000个时转载 2015-07-18 09:00:47 · 6241 阅读 · 0 评论 -
va_start和va_end使用详解
1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表void foo(...);void foo(parm_list,...);这种方式和我们以前认识的不大一样,但我们要记住这是C中一种传参的形式,在后面我们就会用到它。2.函数参数的传递原理 函数参数是以数据结构:栈的形式存取,从右至左入栈。 首先是参数的内存存放格式:参数转载 2015-03-01 21:09:01 · 815 阅读 · 0 评论 -
使用intptr_t和uintptr_t
intptr_t 和uintptr_t 类型用来存放指针地址。它们提供了一种可移植且安全的方法声明指针,而且和系统中使用的指针长度相同,对于把指针转化成整数形式来说很有用。uintptr_t 是intptr_t 的无符号版本。对于大部分操作,用intptr_t 比较好。uintptr_t 不像intptr_t 那样灵活。下面的例子说明如何使用intptr_t:int num;转载 2015-01-03 10:35:29 · 5148 阅读 · 0 评论 -
BOOST学习
直接参考:http://blog.csdn.net/huang_xw/article/category/1209379转载 2015-01-31 23:03:27 · 692 阅读 · 0 评论 -
C/C++中的变量存储类别以及内存分配
本文也是总结了网上一些大神们的博客(写得太牛逼了),然后结合自己看书的一些内容。参考: http://hi.baidu.com/lcplj123/item/e984cd0f921e39c12e4c6baa http://www.eefocus.com/zhangjingbin/blog/10-05/190629_014转载 2013-06-01 08:07:05 · 1912 阅读 · 0 评论 -
C++一些注意点之静态成员
定义类时实际上是定义了一种数据类型,编译程序并不为数据类型分配存储空间。只有在说明对象时才为对象的每个成员分配空间,并把占有的空间当一个整体来看待。当我们将类的一个成员存储类型指定为静态类型时,则由该类所产生的所有对象均共享为其静态成员所分配的一个存储空间。换言之,在说明对象时,并不为静态类型的成员分配空间。1.静态数据成员 静态数据成员注意一下几点: (1)类的静态成原创 2013-06-10 15:52:25 · 2671 阅读 · 2 评论 -
errno与perror
很多系统函数在错误返回时将错误原因记录在libc定义的全局变量errno中,每种错误原因对应一个错误码,请查阅errno(3)的Man Page了解各种错误码,errno在头文件errno.h中声明,是一个整型变量,所有错误码都是正整数。如果在程序中打印错误信息时直接打印errno变量,打印出来的只是一个整数值,仍然看不出是什么错误。比较好的办法是用perror或strerror函数将er转载 2013-08-03 19:37:36 · 1888 阅读 · 0 评论 -
C++一些注意点之operator new 和new operator
在C++中,operator new和new operator还是很有区别。new operator是c++内建的,无法改变其行为;而operator new 是可以根据自己的内存分配策略去重载的。1. operator new operator new和operator delete有两个重载版本,每个版本支持相关的new表达式和delete表达式:原创 2013-06-30 04:52:17 · 2925 阅读 · 1 评论 -
VC++6.0调试入门
概述调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。这里我简要的根据自己的经验列出调试中比较常用的技巧,希望对大家有用。本文约定,在选择菜单时,通过/表示分级菜单,例如File/Open表示顶级菜单File的子菜单Open。 设置为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个转载 2013-08-03 14:27:28 · 1181 阅读 · 0 评论 -
C++一些注意点之操作符重载
重载操作符需要注意(1)重载操作符必须具有一个类类型操作数。不能重载内建类型的操作符。operator +(int,int);//这个是错误的,都为内建类型operator +(int,classType);//可以改成这样,保证有一个自定义类型(2)重载操作符可以定义为普通非成员函数或者类的成员函数。当定义为类的成员函数,默认含有一个this指针,作为一个参数;当定义非成员函数时,原创 2013-08-01 14:18:19 · 1607 阅读 · 0 评论 -
C++浅拷贝和深拷贝的区别
c++默认的拷贝构造函数是浅拷贝 浅拷贝就是对象的数据成员之间的简单赋值,如你设计了一个没有类而没有提供它的复制构造函数,当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝,如:class A {public: A(int _data) : data(_data){} A(){}private: int data; };int main()转载 2013-06-26 22:22:18 · 2675 阅读 · 4 评论 -
c++中_onexit使用方法
//以下理解如有错误请指正,谢谢! //////////////////////////////////////////////////////////// // Author: sky // Date: 2011.10.4 // Content: _onexit ////////////////////转载 2013-06-08 10:24:07 · 1573 阅读 · 0 评论 -
浅谈编译器优化
“memory”比较特殊,可能是内嵌汇编中最难懂部分。为解释清楚它,先介绍一下编译器的优化知识,再看C关键字volatile。最后去看该描述符。 1、编译器优化介绍 内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令转载 2013-06-15 09:45:06 · 3429 阅读 · 0 评论 -
有关指针的心得之指针常见错误
转自:http://www.eefocus.com/zhangjingbin/blog/10-05/190629_014f8.html1.常见的内存错误及对策 发生内存错误是件非常麻烦 的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。有时用户怒气冲冲地把 你找来,程序却没有发生任何问题,你一走,错误又发作转载 2013-06-01 17:12:02 · 2269 阅读 · 0 评论 -
C++一些注意点之友元函数、虚函数以及const和volatile对象
1.友元函数 定义类时,在类中加上关键字修饰函数,则该函数就能成为该类的友元函数,它可以访问该类的所有成员。关于友元函数需要注意以下几点: (1)友元函数不是类的成员,不带this指针,必须通过对象名或者对象的引用作为友元函数的参数来访问对象的成员。友元函数必须在类定义中说明(但是对友元函数指定访问权限无效,因为友元函数不属于类,所以在类中不管哪声明都是一样的效果)可以原创 2013-06-10 21:19:38 · 3210 阅读 · 1 评论 -
面向对象的三个基本特征
面向对象的三个基本特征是:封装、继承、多态。封装封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。继承面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下转载 2013-06-08 13:29:07 · 1226 阅读 · 0 评论 -
C语言的const关键字与指针搭配使用
C语言的const关键字与指针搭配使用,const是C语言中保留的一个关键字,它用来限定一个变量是只读的,即不可变的。程序中使用const可以在一定程度上提高程序的健壮性,但是程序中使用过多的const,可能在对代码的阅读时增加一定的难度。(1)用const修饰一般变量注意在C语言中,用const修饰的变量必须在声明时进行初始化(用来修饰函数的形参除外);如:c转载 2013-04-28 20:55:18 · 1100 阅读 · 0 评论