
Cpp&linux技术
文章平均质量分 55
tenfyguo
目前在国内某互联网公司从事移动支付和互联网金融相关产品的架构设计和研发管理工作。
展开
-
内存分配函数malloc和calloc的区别
一,函数的说明头文件: stdlib.h或malloc.h函数原型:void *calloc(unsigned n, unsigned size);功 能:在内存的动态存储区堆中中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。跟malloc的区别:calloc在动态分配完内存后,自动初始化该内存空间为零原创 2013-06-21 22:37:46 · 1584 阅读 · 0 评论 -
解决程序空跑的建议
在解决空跑上递进地给下面几个建议:1) 下标索引——最佳情况,对于连续且上、下限范围小的ID查找2) 哈希索引——ID离散且上下限跨度大3) 排序&&二分4) 指针引用——如果不可哈希、不可排序tenfyguo,本内容来自腾讯内部分享,请勿外传!原创 2013-03-06 20:14:34 · 1795 阅读 · 0 评论 -
关于strncpy的使用说明
原型:char * strncpy(char *dest, char *src, size_t n);功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是直到复制完第n个字符才停止,不管途中是否遇到了NULL,即在n个字符内会连同NULL一起复制),返回指向dest的指针。头文件:#include "s原创 2013-02-21 17:20:36 · 1221 阅读 · 0 评论 -
C++ 对象的内存布局(上)
来自:http://blog.youkuaiyun.com/haoel/article/details/3081328 C++ 对象的内存布局(上)转载 2013-01-30 11:55:20 · 706 阅读 · 0 评论 -
c语言中的宏定义技巧
from:http://blog.21ic.com/user1/2949/archives/2007/35550.html1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。转载 2011-11-18 20:42:55 · 784 阅读 · 0 评论 -
【转】浅谈编译器优化
“memory”比较特殊,可能是内嵌汇编中最难懂部分。为解释清楚它,先介绍一下编译器的优化知识,再看C关键字volatile。最后去看该描述符。 1、编译器优化介绍 内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令原创 2011-11-17 18:30:19 · 1030 阅读 · 0 评论 -
c语言关键字volatile的用法3
在学习C关键词的时候,我们看到了一个新面孔——volatile。在程序员面试宝典中提到“关键字volatile的面试例题是考查嵌入式编程”,中间有一段解析: 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难。 假转载 2011-11-17 13:16:00 · 3217 阅读 · 0 评论 -
详解volatile关键词的用法2
volatile 影响编译器的结果输出,volatile 修饰的变量标明随时可能发生变化的(是指可能被本线程外的其他机制修改:如其他线程,中断,硬件),与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。例如: volatile int i=10;原创 2011-11-17 11:49:22 · 839 阅读 · 0 评论 -
详解volatile关键词的用法1
from:http://baike.baidu.com/view/608706.htm 一,volatile是什么? volatile是一个类型修饰符(type specifier),它跟const等一样,它是被设计用来修饰被不同线程访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。简单地说就是原创 2011-11-16 15:27:01 · 963 阅读 · 0 评论 -
防止编译器过度优化导致的并发异常问题
编译器为了优化程序的执行性能,可能对代码的执行顺序进行了调整或者是使用了寄存器代替内存访问,这种情况下,我们可以使用volatile关键字试图阻止过度优化,volatile主要做了两件事情:1,阻止编译器为了提高速度将一个变量缓冲到寄存器内而不写回。(在多线程并发下由于寄存器属于线程所有,会导致问题)2,阻止编译器调整操作volatile变量的指令顺序。(但解决不了由于CPU的动态调度原创 2011-11-01 13:26:56 · 2651 阅读 · 0 评论 -
柔性数组
<br />处理二进制协议时,过去常用的方法是,只定义协议头,或者用char data[1]定义协议体<br />只定义协议头不够直观,需要计算协议体地址;而data[1]需要进行类型转换,其实也是计算协议体地址<br />现在发现有一种更“优雅”的方法:柔性数组,可以这样定义:<br />struct protocol<br />{<br /> uint32_t len;<br /> uint32_t type;<br /> uint16_t cmd;<br /> byte dat转载 2011-05-12 20:29:00 · 7762 阅读 · 3 评论 -
GNU的__attribute__机制
GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。<br />__attribute__书写特征是:__attribute__前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数。<br />__attribute__语法格式为:<br />__attribute__转载 2010-11-11 18:11:00 · 661 阅读 · 0 评论 -
atoi和strtol的区别和使用
<br /> atoi和strtol函数均是把字符串转换成整数,两者的不同点主要是:<br />1,atoi的返回值无法区分是正常的返回还是错误的返回,如:<br /> int val;<br /> val = atoi("abc"); 与val = atoi("0");<br /> 两者返回的val均为0,因此无法区分哪个是正确parse后的值。<br /> <br />2,strtol函数对异常的返回可以设置errno,从而可以发现异常的返回,如:<br />原创 2010-09-06 14:40:00 · 31234 阅读 · 1 评论 -
C++ 对象的内存布局(下)
来自:http://blog.youkuaiyun.com/haoel/article/details/3081385 C++ 对象的内存布局(下) 陈皓http://blog.youkuaiyun.com/haoel 重复继承 下面我们再来看看,发生重复继承的情况。所谓重复继承,也就是某个基类被间接地重复继承了多次。 下图是一个继承图,我们重载了父类的f()函数。转载 2013-02-01 11:17:27 · 555 阅读 · 0 评论 -
C++ 虚函数表解析
C++ 虚函数表解析 陈皓http://blog.youkuaiyun.com/haoel前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数转载 2013-01-29 20:28:54 · 553 阅读 · 0 评论 -
深入剖析GCC函数调用堆栈变化过程
from:http://stackoverflow.com/questions/2515598/push-ebp-movlesp-ebp 大家在通过反汇编去分析gcc生成的AT&T汇编语句的时候,经常会发现在函数调用的开始总有下面的两条汇编语句: push %ebp movl %esp, %ebp 在函数调用结束的翻译 2011-12-26 19:10:04 · 5529 阅读 · 0 评论 -
编写高质量的Makefile
<br />源地址 :http://acm.hrbeu.edu.cn/forums/index.php?showtopic=1827&st=0&gopid=8924&#entry8924<br /><br />一、前言<br /><br />回想自己的第一个Makefile,是这个样子的<br /><br />CODEhello:hello.c<br /> gcc hello.c -o hello<br /><br /><br />后来有所进步,陆续地写了一些大都是这个样子的Makefile:<br转载 2010-09-12 15:31:00 · 2449 阅读 · 1 评论 -
网络游戏程序员须知 UDP vs TCP
<br />本文为作者原创翻译并且加入了一些自己的思路和观点,转载请注明。<br />作者:rellikt@gmail.com<br />首发链接:http://blog.youkuaiyun.com/rellikt/archive/2010/08/21/5829020.aspx<br />原文链接:http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/<br /> 这篇教程让我们就从最基本的网络数据收发开始谈起吧。其实这部分才是网络程序转载 2010-08-28 15:34:00 · 950 阅读 · 0 评论 -
网络游戏程序员须知 收包与发包
<br />本文为作者原创翻译并且加入了一些自己的思路和观点,转载请注明。<br />作者:rellikt@gmail.com<br />首发链接:http://blog.youkuaiyun.com/rellikt/archive/2010/08/23/5833233.aspx<br />原文链接:http://gafferongames.com/networking-for-game-programmers/sending-and-receiving-packets/<br />简介<br /> 大家好,今天我们就转载 2010-08-28 15:26:00 · 898 阅读 · 0 评论 -
linux system函数使用详解
<br />相关函数<br />fork,execve,waitpid,popen<br />表头文件<br />#include<stdlib.h><br />定义函数<br />int system(const char * string);<br />函数说明<br />system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD 信号会被暂时搁置,SI转载 2010-08-26 20:00:00 · 960 阅读 · 0 评论 -
linux下让进程运行在指定的cpu上
<br />最近负责的svr压力比较大,业务逻辑有点复杂,能优化的地方已经全部优化了,<br />目前每秒3k次,cpu负载还是比较高<br />top看一下,4核的cpu负载不是太均衡,打算考虑一下将业务进程指定到3个cpu上运行,另外一个cpu专门负责处理网络收发包;打算尝试一下,如果还是不行,再过段时间,访问量再增加的话,就要加机器了,呜呜<br />补充:今天测试了一下,效果挺好,同样进程数的情况下,进行cpu绑定<br />每个cpu都利用起来了,负载也比不绑定的情况下好了很多<br />分析一下转载 2010-08-01 15:56:00 · 747 阅读 · 0 评论 -
volatile——编写多线程程序的好帮手
<br />Volatile-Correctness,让编译器帮你检测竞争条件<br />Andrei Alexandrescu<br />ye_feng译 <br />并不是我故意想弄糟你的心情,但是在这期专栏里,我们将讨论多线程编程这一话题。正如上一期Generic里所说的,编写异常安全(exception-safe)的程序是非常困难的,但是和编写多线程程序比起来,那简直就是儿戏。 <br />多线程的程序是出了名的难编写、难验证、难调试、难维护,这通常是件苦差事。不正确的多线程程序可能可以运行转载 2010-08-01 15:47:00 · 671 阅读 · 0 评论 -
使用 GNU profiler 来提高代码运行速度
<br />原文链接:http://www.ibm.com/developerworks/cn/linux/l-gnuprof.html<br /> <br />使用 GNU profiler 来提高代码运行速度寻找应用程序中占用时间最长的部分<br /><br />Martyn Honeyford (martynh@uk.ibm.com), 软件工程师, IBM UK Labs<br /><br />2006 年 5 月 08 日<br />改进应用程序的性能是一项非常耗时耗力的工作,但是究竟程转载 2010-08-01 15:16:00 · 586 阅读 · 0 评论 -
C++虚函数(三)
<br />三. 虚函数使用技巧 <br />3.1 private的虚函数 <br /> 考虑下面的例子:<br /><br />class A<br />{<br />public:<br />void foo() { bar();}<br />private:<br />virtual void bar() { ...}<br />};<br />class B: public A<br />{<br />private:<br />virtual void bar() { ...}<br />};转载 2010-07-31 15:09:00 · 567 阅读 · 0 评论 -
c++虚函数(一)
<br />虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次:<br /><br />class A<br />{<br />public:<br />virtual void foo() { cout << "A::foo() is called" << endl;}<br />};<br />class B: public A<br />{<br />public:<br />virtual void foo() { cou转载 2010-07-31 15:08:00 · 514 阅读 · 0 评论 -
c++虚函数(二)
二. 虚函数的语法 虚函数的标志是“virtual”关键字。2.1 使用virtual关键字 考虑下面的类层次:class A{public:virtual void foo();};class B: public A{public:void foo(); // 没有virtual关键字!};class C: public B // 从B继承,不是从A继承!{public:void foo(); // 也没有virtual关键字!}; 这种情况下,B::foo()是虚函数,C::foo()也同样是转载 2010-07-31 14:54:00 · 600 阅读 · 0 评论 -
C++ Virtual函数
虚函数是C++中用于多态的机制。核心理念就是通过基类访问派生类定义的函数。基类的析构含糊都必须是virtual的虚函数只能借助于指针或者引用来达到多态的效果。前提B类继承与A类 且foo()为虚函数void bar(A *a){ a->foo();//被调用的是A::foo()还是B::foo() ?}如果a指向的是A类的实例,则A::foo()被调用,如果a指向的是B类实例,则指向B::foo();在设计一个基类的时候,如果发现一个函数需要在派生类里有不同的表现,那么它就应该是虚的。从设计角度讲,出现在转载 2010-07-31 14:44:00 · 1229 阅读 · 0 评论 -
C++箴言:理解typename的两个含义
from: http://blog.youkuaiyun.com/fxpopboy/archive/2006/12/30/1469657.aspx问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template class Widget; // uses "class"template class Widget; // uses "typename" 答案:没什么不同。在声明一个 template type parameter(模板类型参数)转载 2010-07-29 17:45:00 · 598 阅读 · 0 评论 -
c++中new和delete的默认赋值测试
<br /> 为了测试c++中对new操作符的运算规则是否调用默认对象的构造函数进行初始化,故写出如下的测试demo:<br />#include <iostream>using namespace std;//using std::cout 或者using std::endltemplate <class eleType>void print_value(eleType *a, int size){ if(!a || size <=0) { cout原创 2010-07-27 18:57:00 · 3066 阅读 · 0 评论 -
别把typedef当作宏使用
<br /> 在开发过程中,我们常常需要自定义数据类型,比如自定义结构体等,为了代码的可读性,我们对自定义的类型常常会利用typedef关键字进行重新类型定义。比如:<br />typedef struct _item_t{ int iUin; char sName[50]; ...} item_t;//然后可以如下使用item_t item;<br /> 但在使用typedef的过程中,我们也很容易陷入一些误区,最典型的其中一个是把typed原创 2010-07-23 19:38:00 · 1000 阅读 · 0 评论 -
类型转换之类型扩展
<br /> 和同学探讨32位地址到64位地址转换的问题时,勾起了曾经做过的项目的一类bug的回忆。<br />类型转换特别是隐式规则转换是有点麻烦的,稍不注意就会犯错误。<br />这个问题是这样的<br />void *p = &a;<br />unsigned long long mem_64_bits = (unsigned long long)p;<br />当然在整个系统里不可能有这么清晰了,将地址转换强制为64位时,本来想要0扩展,结果却成了有符号为扩展来转换<br />。<br />转载 2010-07-17 19:50:00 · 1028 阅读 · 0 评论 -
curl的使用
<br />原文转自ChinaUnix, 链接http://bbs.chinaunix.net/thread-586014-1-1.html<br /> <br /> 前两天看到有人求客户端socket 发HTTP包的代码,受flw版主启发找了一些perl的资料,不过对perl 还是不太熟悉。也没有深入的研究。无意中发现了libcurl.so 这个库。去google上搜索发现它是处理客户端发送HTTP请求的库 以及可以处理web服务器回送回来的包。研究了两天将研究的成果,共享出来给大家一起研究。<转载 2010-07-17 19:08:00 · 974 阅读 · 0 评论 -
转:关于GCC中同时使用动态和静态库链接的操作参数和解释
<br />来自:http://blog.sina.com.cn/s/blog_4cb133e5010009zx.html<br /> <br /> 在我们开发的一个系统中,由于动态链接其中的一个动态库时,编译时没有问题,而运行时不能进行,如果将该库静态连接时,运行却没有问题。具体什么原因,一直没有搞清楚,权且当作暂时的解决办法。 如何同时同时使用动态和静态库链接,同事周楠提供了一个参数的用法,在GCC指令参数中具体参数如下: -Wl,-Bstatic -L/usr/local/sqlite转载 2010-07-15 19:22:00 · 3181 阅读 · 0 评论 -
c++的异常处理demo
<br />//下面的demo代码可以直接拷贝到文件,并且在g++编译器编译后即可执行<br /> <br /> <br />#include <stdlib.h><br />#include <time.h><br />#include <stdio.h><br />#include <unistd.h><br />#include <string><br />#include <iostream><br />using namespace std;<br /> <br />//定义用于测试的异常类<br原创 2010-06-30 18:04:00 · 820 阅读 · 0 评论 -
C++ 异常处理 入门
<br />异常:程序执行期间,可检测到的不正常情况。<br />例如:0作除数;数组下标越界;打开不存在的文件;远程机器连接超时;malloc失败等等。<br />程序的两种状态:<br />正常状态和异常状态,发生不正常情况后,进入异常状态,从当前函数开始,按调用链的相反次序,查找处理该异<br />常的程序片断。<br />1.throw 表达式<br />语义:用表达式的值生成一个对象(异常对象),程序进入异常状态。<br />Terminate函数,终止程序的执行。<br />2.try-catc转载 2010-06-26 16:38:00 · 1181 阅读 · 0 评论 -
深入分析Memcached的线程接入模型---下
/* * Processes an incoming "handle a new connection" item. This is called when * input arrives on the libevent wakeup pipe. */static void thread_libevent_process(int fd, short which, void *arg原创 2010-01-31 13:59:00 · 3113 阅读 · 1 评论 -
深入分析Memcached的线程接入模型---中
三,在main()函数中,初始化main_thread的event_base实例,见memcached.c//定义main_thread的event_base实例static struct event_base *main_base;//下面代码略…/* initialize main thread libevent instance , 初始化事件API */ma原创 2010-01-31 13:40:00 · 3331 阅读 · 0 评论 -
深入分析Memcached的线程接入模型---上
memcached是一个分布式的内存cache系统,目前被大量地运用于各种各样的站点中,以不断提高站点的总体访问性能,而另外一方面,memcached的使用是非常简单的,可以说,使用门槛很低,这也许是造成memcached目前非常流行的原因之一。 我们可以看到,网上分析memcached的文章也比较多,本文是笔者结合memcached源代码的基础上对其线程接入模型进行深入的分析,通过学习和原创 2010-01-31 00:31:00 · 6463 阅读 · 3 评论 -
__attribute__ 详解【转】
来自:http://blog.youkuaiyun.com/ruixj/archive/2009/06/16/4274721.aspx GNU C的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。_原创 2010-01-28 17:57:00 · 963 阅读 · 0 评论 -
new, calloc和malloc的区别
函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别。 malloc()函数有一个参数,即要分配的内存空间的大小: void *malloc(size_t size); calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。 void *calloc(si原创 2010-01-16 22:55:00 · 1145 阅读 · 0 评论